objostr.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:28k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objostr.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:39:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.86
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJOSTR__HPP
  10. #define OBJOSTR__HPP
  11. /*  $Id: objostr.hpp,v 1000.4 2004/06/01 19:39:02 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   !!! PUT YOUR DESCRIPTION HERE !!!
  40. */
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbifloat.h>
  43. #include <corelib/ncbiobj.hpp>
  44. #include <corelib/ncbiutil.hpp>
  45. #include <serial/serialdef.hpp>
  46. #include <serial/typeinfo.hpp>
  47. #include <util/strbuffer.hpp>
  48. #include <serial/objlist.hpp>
  49. #include <serial/objstack.hpp>
  50. #include <serial/hookdatakey.hpp>
  51. #include <serial/objhook.hpp>
  52. #include <serial/pathhook.hpp>
  53. /** @addtogroup ObjStreamSupport
  54.  *
  55.  * @{
  56.  */
  57. struct asnio;
  58. BEGIN_NCBI_SCOPE
  59. class CMemberId;
  60. class CDelayBuffer;
  61. class CConstObjectInfo;
  62. class CConstObjectInfoMI;
  63. class CWriteObjectHook;
  64. class CWriteClassMembersHook;
  65. class CWriteChoiceVariantHook;
  66. class CContainerTypeInfo;
  67. class CClassTypeInfo;
  68. class CChoiceTypeInfo;
  69. class CObjectStreamCopier;
  70. class CAliasTypeInfo;
  71. class CWriteObjectInfo;
  72. class CWriteObjectList;
  73. class NCBI_XSERIAL_EXPORT CObjectOStream : public CObjectStack
  74. {
  75. public:
  76.     typedef size_t TObjectIndex;
  77.     // open methods
  78.     static CObjectOStream* Open(ESerialDataFormat format,
  79.                                 const string& fileName,
  80.                                 TSerialOpenFlags openFlags = 0);
  81.     static CObjectOStream* Open(const string& fileName,
  82.                                 ESerialDataFormat format);
  83.     static CObjectOStream* Open(ESerialDataFormat format,
  84.                                 CNcbiOstream& outStream,
  85.                                 bool deleteOutStream = false);
  86.     void Close(void);
  87.     void ResetLocalHooks(void);
  88.     // when enabled, stream verifies data on output
  89.     // and throws CUnassignedMember exception
  90.     // for this particular stream
  91.     void SetVerifyData(ESerialVerifyData verify);
  92.     ESerialVerifyData GetVerifyData(void) const;
  93.     // for streams created by the current thread
  94.     static  void SetVerifyDataThread(ESerialVerifyData verify);
  95.     // for streams created by the current process
  96.     static  void SetVerifyDataGlobal(ESerialVerifyData verify);
  97.     void SetUseIndentation(bool set);
  98.     bool GetUseIndentation(void) const;
  99.     // constructors
  100. protected:
  101.     CObjectOStream(ESerialDataFormat format,
  102.                    CNcbiOstream& out, bool deleteOut = false);
  103. public:
  104.     virtual ~CObjectOStream(void);
  105.     // get data format
  106.     ESerialDataFormat GetDataFormat(void) const;
  107.     // USER INTERFACE
  108.     // flush buffer
  109.     void FlushBuffer(void);
  110.     // flush buffer and underlying stream
  111.     void Flush(void);
  112.     // root writer
  113.     void Write(const CConstObjectInfo& object);
  114.     void Write(TConstObjectPtr object, TTypeInfo type);
  115.     void Write(TConstObjectPtr object, const CTypeRef& type);
  116.     // subtree writer
  117.     void WriteObject(const CConstObjectInfo& object);
  118.     void WriteObject(TConstObjectPtr object, TTypeInfo typeInfo);
  119.     void CopyObject(TTypeInfo objectType,
  120.                     CObjectStreamCopier& copier);
  121.     
  122.     void WriteSeparateObject(const CConstObjectInfo& object);
  123.     // internal writer
  124.     void WriteExternalObject(TConstObjectPtr object, TTypeInfo typeInfo);
  125.     // member interface
  126.     void WriteClassMember(const CConstObjectInfoMI& member);
  127.     // choice variant interface
  128.     void WriteChoiceVariant(const CConstObjectInfoCV& member);
  129.     // Separator management
  130.     string GetSeparator(void) const;
  131.     void SetSeparator(const string sep);
  132.     // Controls auto-output of the separator after each object. By default
  133.     // this flag is true for text ASN.1 streams only.
  134.     bool GetAutoSeparator(void);
  135.     void SetAutoSeparator(bool value);
  136.     CObjectOStream& operator<< (CObjectOStream& (*mod)(CObjectOStream& os));
  137.     friend CObjectOStream& Separator(CObjectOStream& os);
  138.     // END OF USER INTERFACE
  139.     // low level writers
  140.     // root object
  141.     virtual void WriteFileHeader(TTypeInfo type);
  142.     virtual void EndOfWrite(void);
  143.     // std C types readers
  144.     // bool
  145.     void WriteStd(const bool& data);
  146.     // char
  147.     void WriteStd(const char& data);
  148.     // integer number
  149.     void WriteStd(const signed char& data);
  150.     void WriteStd(const unsigned char& data);
  151.     void WriteStd(const short& data);
  152.     void WriteStd(const unsigned short& data);
  153.     void WriteStd(const int& data);
  154.     void WriteStd(const unsigned int& data);
  155. #if SIZEOF_LONG == 4
  156.     void WriteStd(const long& data);
  157.     void WriteStd(const unsigned long& data);
  158. #endif
  159.     void WriteStd(const Int8& data);
  160.     void WriteStd(const Uint8& data);
  161.     // float number
  162.     void WriteStd(const float& data);
  163.     void WriteStd(const double& data);
  164. #if SIZEOF_LONG_DOUBLE != 0
  165.     void WriteStd(const long double& data);
  166. #endif
  167.     // string
  168.     void WriteStd(const string& data);
  169.     void WriteStd(const CStringUTF8& data);
  170.     // C string; VisualAge can't cope with refs here.
  171.     void WriteStd(const char* const data);
  172.     void WriteStd(char* const data);
  173.     // primitive writers
  174.     // bool
  175.     virtual void WriteBool(bool data) = 0;
  176.     // char
  177.     virtual void WriteChar(char data) = 0;
  178.     // integer numbers
  179.     virtual void WriteInt4(Int4 data) = 0;
  180.     virtual void WriteUint4(Uint4 data) = 0;
  181.     virtual void WriteInt8(Int8 data) = 0;
  182.     virtual void WriteUint8(Uint8 data) = 0;
  183.     // float numbers
  184.     virtual void WriteFloat(float data);
  185.     virtual void WriteDouble(double data) = 0;
  186. #if SIZEOF_LONG_DOUBLE != 0
  187.     virtual void WriteLDouble(long double data);
  188. #endif
  189.     // string
  190.     virtual void WriteString(const string& str,
  191.                              EStringType type = eStringTypeVisible) = 0;
  192.     virtual void CopyString(CObjectIStream& in) = 0;
  193.     // StringStore
  194.     virtual void WriteStringStore(const string& data) = 0;
  195.     virtual void CopyStringStore(CObjectIStream& in) = 0;
  196.     // C string
  197.     virtual void WriteCString(const char* str) = 0;
  198.     // NULL
  199.     virtual void WriteNull(void) = 0;
  200.     // enum
  201.     virtual void WriteEnum(const CEnumeratedTypeValues& values,
  202.                            TEnumValueType value) = 0;
  203.     virtual void CopyEnum(const CEnumeratedTypeValues& values,
  204.                           CObjectIStream& in) = 0;
  205.     // any content object
  206.     virtual void WriteAnyContentObject(const CAnyContentObject& obj) = 0;
  207.     virtual void CopyAnyContentObject(CObjectIStream& in) = 0;
  208.     // delayed buffer
  209.     virtual bool Write(CByteSource& source);
  210.     // low level readers:
  211.     enum EFailFlags {
  212.         fNoError       = 0,             eNoError     = fNoError,
  213.         fEOF           = 1 << 0,        eEOF         = fEOF,
  214.         fWriteError    = 1 << 1,        eWriteError  = fWriteError,
  215.         fFormatError   = 1 << 2,        eFormatError = fFormatError,
  216.         fOverflow      = 1 << 3,        eOverflow    = fOverflow,
  217.         fInvalidData   = 1 << 4,        eInvalidData = fInvalidData,
  218.         fIllegalCall   = 1 << 5,        eIllegalCall = fIllegalCall,
  219.         fFail          = 1 << 6,        eFail        = fFail,
  220.         fNotOpen       = 1 << 7,        eNotOpen     = fNotOpen,
  221.         fUnassigned    = 1 << 8,        eUnassigned  = fUnassigned
  222.     };
  223.     typedef int TFailFlags;
  224.     bool fail(void) const;
  225.     TFailFlags GetFailFlags(void) const;
  226.     TFailFlags SetFailFlagsNoError(TFailFlags flags);
  227.     TFailFlags SetFailFlags(TFailFlags flags, const char* message);
  228.     TFailFlags ClearFailFlags(TFailFlags flags);
  229.     bool InGoodState(void);
  230.     virtual string GetStackTrace(void) const;
  231.     virtual string GetPosition(void) const;
  232.     size_t GetStreamOffset(void) const;
  233.     enum EFlags {
  234.         fFlagNone                = 0,
  235.         eFlagNone                = fFlagNone,
  236.         fFlagAllowNonAsciiChars  = 1 << 0,
  237.         eFlagAllowNonAsciiChars  = fFlagAllowNonAsciiChars
  238.     };
  239.     typedef int TFlags;
  240.     TFlags GetFlags(void) const;
  241.     TFlags SetFlags(TFlags flags);
  242.     TFlags ClearFlags(TFlags flags);
  243.     void ThrowError1(const char* file, int line,
  244.                      TFailFlags fail, const char* message);
  245.     void ThrowError1(const char* file, int line,
  246.                      TFailFlags fail, const string& message);
  247. #define ThrowError(flag, mess) ThrowError1(__FILE__, __LINE__,flag,mess)
  248.     class ByteBlock;
  249.     friend class ByteBlock;
  250.     class ByteBlock
  251.     {
  252.     public:
  253.         ByteBlock(CObjectOStream& out, size_t length);
  254.         ~ByteBlock(void);
  255.         CObjectOStream& GetStream(void) const;
  256.         size_t GetLength(void) const;
  257.         void Write(const void* bytes, size_t length);
  258.         void End(void);
  259.     private:
  260.         CObjectOStream& m_Stream;
  261.         size_t m_Length;
  262.         bool m_Ended;
  263.     };
  264.     class CharBlock;
  265.     friend class CharBlock;
  266.     class NCBI_XSERIAL_EXPORT CharBlock
  267.     {
  268.     public:
  269.         CharBlock(CObjectOStream& out, size_t length);
  270.         ~CharBlock(void);
  271.         CObjectOStream& GetStream(void) const;
  272.         size_t GetLength(void) const;
  273.         void Write(const char* chars, size_t length);
  274.         void End(void);
  275.     private:
  276.         CObjectOStream& m_Stream;
  277.         size_t m_Length;
  278.         bool m_Ended;
  279.     };
  280. #if HAVE_NCBI_C
  281.     class AsnIo
  282.     {
  283.     public:
  284.         AsnIo(CObjectOStream& out, const string& rootTypeName);
  285.         ~AsnIo(void);
  286.         CObjectOStream& GetStream(void) const;
  287.         void Write(const char* data, size_t length);
  288.         void End(void);
  289.         operator asnio*(void);
  290.         asnio* operator->(void);
  291.         const string& GetRootTypeName(void) const;
  292.     private:
  293.         CObjectOStream& m_Stream;
  294.         string m_RootTypeName;
  295.         asnio* m_AsnIo;
  296.         bool m_Ended;
  297.     public:
  298.         size_t m_Count;
  299.     };
  300.     friend class AsnIo;
  301. public:
  302. #endif
  303.     // mid level I/O
  304.     // named type (alias)
  305.     MLIOVIR void WriteNamedType(TTypeInfo namedTypeInfo,
  306.                                 TTypeInfo typeInfo, TConstObjectPtr object);
  307.     // container
  308.     MLIOVIR void WriteContainer(const CContainerTypeInfo* containerType,
  309.                                 TConstObjectPtr containerPtr);
  310.     void WriteContainerElement(const CConstObjectInfo& element);
  311.     // class
  312.     void WriteClassRandom(const CClassTypeInfo* classType,
  313.                           TConstObjectPtr classPtr);
  314.     void WriteClassSequential(const CClassTypeInfo* classType,
  315.                               TConstObjectPtr classPtr);
  316.     MLIOVIR void WriteClass(const CClassTypeInfo* objectType,
  317.                             TConstObjectPtr objectPtr);
  318.     MLIOVIR void WriteClassMember(const CMemberId& memberId,
  319.                                   TTypeInfo memberType,
  320.                                   TConstObjectPtr memberPtr);
  321.     MLIOVIR bool WriteClassMember(const CMemberId& memberId,
  322.                                   const CDelayBuffer& buffer);
  323.     // choice
  324.     MLIOVIR void WriteChoice(const CChoiceTypeInfo* choiceType,
  325.                              TConstObjectPtr choicePtr);
  326.     // alias
  327.     MLIOVIR void WriteAlias(const CAliasTypeInfo* aliasType,
  328.                             TConstObjectPtr aliasPtr);
  329.     // COPY
  330.     // named type (alias)
  331.     MLIOVIR void CopyNamedType(TTypeInfo namedTypeInfo,
  332.                                TTypeInfo typeInfo,
  333.                                CObjectStreamCopier& copier);
  334.     // container
  335.     MLIOVIR void CopyContainer(const CContainerTypeInfo* containerType,
  336.                                CObjectStreamCopier& copier);
  337.     // class
  338.     MLIOVIR void CopyClassRandom(const CClassTypeInfo* objectType,
  339.                                  CObjectStreamCopier& copier);
  340.     MLIOVIR void CopyClassSequential(const CClassTypeInfo* objectType,
  341.                                      CObjectStreamCopier& copier);
  342.     // choice
  343.     MLIOVIR void CopyChoice(const CChoiceTypeInfo* choiceType,
  344.                             CObjectStreamCopier& copier);
  345.     // alias
  346.     MLIOVIR void CopyAlias(const CAliasTypeInfo* AliasType,
  347.                             CObjectStreamCopier& copier);
  348.     // low level I/O
  349.     // named type
  350.     virtual void BeginNamedType(TTypeInfo namedTypeInfo);
  351.     virtual void EndNamedType(void);
  352.     // container
  353.     virtual void BeginContainer(const CContainerTypeInfo* containerType) = 0;
  354.     virtual void EndContainer(void);
  355.     virtual void BeginContainerElement(TTypeInfo elementType);
  356.     virtual void EndContainerElement(void);
  357.     // class
  358.     virtual void BeginClass(const CClassTypeInfo* classInfo) = 0;
  359.     virtual void EndClass(void);
  360.     virtual void BeginClassMember(const CMemberId& id) = 0;
  361.     virtual void EndClassMember(void);
  362.     // choice
  363.     virtual void BeginChoice(const CChoiceTypeInfo* choiceType);
  364.     virtual void EndChoice(void);
  365.     virtual void BeginChoiceVariant(const CChoiceTypeInfo* choiceType,
  366.                                     const CMemberId& id) = 0;
  367.     virtual void EndChoiceVariant(void);
  368.     // write byte blocks
  369.     virtual void BeginBytes(const ByteBlock& block);
  370.     virtual void WriteBytes(const ByteBlock& block,
  371.                             const char* bytes, size_t length) = 0;
  372.     virtual void EndBytes(const ByteBlock& block);
  373.     // write char blocks
  374.     virtual void BeginChars(const CharBlock& block);
  375.     virtual void WriteChars(const CharBlock& block,
  376.                             const char* chars, size_t length) = 0;
  377.     virtual void EndChars(const CharBlock& block);
  378.     void WritePointer(TConstObjectPtr object, TTypeInfo typeInfo);
  379. protected:
  380.     friend class CObjectStreamCopier;
  381.     // low level writers
  382.     virtual void WriteNullPointer(void) = 0;
  383.     virtual void WriteObjectReference(TObjectIndex index) = 0;
  384.     virtual void WriteThis(TConstObjectPtr object,
  385.                            TTypeInfo typeInfo);
  386.     virtual void WriteOtherBegin(TTypeInfo typeInfo) = 0;
  387.     virtual void WriteOtherEnd(TTypeInfo typeInfo);
  388.     virtual void WriteOther(TConstObjectPtr object, TTypeInfo typeInfo);
  389.     void RegisterObject(TTypeInfo typeInfo);
  390.     void RegisterObject(TConstObjectPtr object, TTypeInfo typeInfo);
  391.     // report error about unended block
  392.     void Unended(const string& msg);
  393.     // report error about unended object stack frame
  394.     virtual void UnendedFrame(void);
  395.     void SetPathWriteObjectHook( const string& path, CWriteObjectHook*        hook);
  396.     void SetPathWriteMemberHook( const string& path, CWriteClassMemberHook*   hook);
  397.     void SetPathWriteVariantHook(const string& path, CWriteChoiceVariantHook* hook);
  398.     static CObjectOStream* OpenObjectOStreamAsn(CNcbiOstream& out,
  399.                                                 bool deleteOut);
  400.     static CObjectOStream* OpenObjectOStreamAsnBinary(CNcbiOstream& out,
  401.                                                       bool deleteOut);
  402.     static CObjectOStream* OpenObjectOStreamXml(CNcbiOstream& out,
  403.                                                 bool deleteOut);
  404. protected:
  405.     void x_SetPathHooks(bool set);
  406.     COStreamBuffer m_Output;
  407.     TFailFlags m_Fail;
  408.     TFlags m_Flags;
  409.     AutoPtr<CWriteObjectList> m_Objects;
  410.     // Write current separator to the stream
  411.     virtual void WriteSeparator(void);
  412.     string m_Separator;
  413.     bool   m_AutoSeparator;
  414.     ESerialDataFormat   m_DataFormat;
  415. private:
  416.     ESerialVerifyData   m_VerifyData;
  417.     static ESerialVerifyData ms_VerifyDataDefault;
  418.     static ESerialVerifyData x_GetVerifyDataDefault(void);
  419.     CStreamObjectPathHook<CWriteObjectHook*>                m_PathWriteObjectHooks;
  420.     CStreamPathHook<CMemberInfo*, CWriteClassMemberHook*>   m_PathWriteMemberHooks;
  421.     CStreamPathHook<CVariantInfo*,CWriteChoiceVariantHook*> m_PathWriteVariantHooks;
  422. public:
  423.     // hook support
  424.     CLocalHookSet<CWriteObjectHook> m_ObjectHookKey;
  425.     CLocalHookSet<CWriteClassMemberHook> m_ClassMemberHookKey;
  426.     CLocalHookSet<CWriteChoiceVariantHook> m_ChoiceVariantHookKey;
  427. };
  428. /* @} */
  429. #include <serial/objostr.inl>
  430. END_NCBI_SCOPE
  431. #endif  /* OBJOSTR__HPP */
  432. /* ---------------------------------------------------------------------------
  433. * $Log: objostr.hpp,v $
  434. * Revision 1000.4  2004/06/01 19:39:02  gouriano
  435. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.86
  436. *
  437. * Revision 1.86  2004/05/24 18:12:24  gouriano
  438. * In text output files make indentation optional
  439. *
  440. * Revision 1.85  2004/04/30 13:28:40  gouriano
  441. * Remove obsolete function declarations
  442. *
  443. * Revision 1.84  2004/03/10 23:18:11  gorelenk
  444. * Added prefix NCBI_XSERIAL_EXPORT for class CObjectOStream::CharBlock .
  445. *
  446. * Revision 1.83  2004/02/09 18:21:53  gouriano
  447. * enforced checking environment vars when setting initialization
  448. * verification parameters
  449. *
  450. * Revision 1.82  2004/01/05 14:24:09  gouriano
  451. * Added possibility to set serialization hooks by stack path
  452. *
  453. * Revision 1.81  2003/11/26 19:59:38  vasilche
  454. * GetPosition() and GetDataFormat() methods now are implemented
  455. * in parent classes CObjectIStream and CObjectOStream to avoid
  456. * pure virtual method call in destructors.
  457. *
  458. * Revision 1.80  2003/11/13 14:06:45  gouriano
  459. * Elaborated data verification on read/write/get to enable skipping mandatory class data members
  460. *
  461. * Revision 1.79  2003/10/21 21:08:46  grichenk
  462. * Fixed aliases-related bug in XML stream
  463. *
  464. * Revision 1.78  2003/08/19 18:32:38  vasilche
  465. * Optimized reading and writing strings.
  466. * Avoid string reallocation when checking char values.
  467. * Try to reuse old string data when string reference counting is not working.
  468. *
  469. * Revision 1.77  2003/08/13 15:47:02  gouriano
  470. * implemented serialization of AnyContent objects
  471. *
  472. * Revision 1.76  2003/07/29 18:47:46  vasilche
  473. * Fixed thread safeness of object stream hooks.
  474. *
  475. * Revision 1.75  2003/05/22 20:08:41  gouriano
  476. * added UTF8 strings
  477. *
  478. * Revision 1.74  2003/05/15 17:45:25  gouriano
  479. * added GetStreamOffset method
  480. *
  481. * Revision 1.73  2003/04/29 18:29:06  gouriano
  482. * object data member initialization verification
  483. *
  484. * Revision 1.72  2003/04/15 16:18:28  siyan
  485. * Added doxygen support
  486. *
  487. * Revision 1.71  2003/04/10 20:13:37  vakatov
  488. * Rollback the "uninitialized member" verification -- it still needs to
  489. * be worked upon...
  490. *
  491. * Revision 1.69  2003/03/10 18:52:37  gouriano
  492. * use new structured exceptions (based on CException)
  493. *
  494. * Revision 1.68  2003/02/04 18:15:22  gouriano
  495. * added reference to corelib/ncbifloat.h
  496. *
  497. * Revision 1.67  2002/12/23 18:38:51  dicuccio
  498. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  499. * Moved all CVS logs to the end.
  500. *
  501. * Revision 1.66  2002/11/14 20:52:01  gouriano
  502. * added BeginChoice/EndChoice methods
  503. *
  504. * Revision 1.65  2002/11/04 21:28:59  grichenk
  505. * Fixed usage of const CRef<> and CRef<> constructor
  506. *
  507. * Revision 1.64  2002/10/25 14:49:29  vasilche
  508. * NCBI C Toolkit compatibility code extracted to libxcser library.
  509. * Serial streams flags names were renamed to fXxx.
  510. *
  511. * Names of flags
  512. *
  513. * Revision 1.63  2002/09/19 14:00:37  grichenk
  514. * Implemented CObjectHookGuard for write and copy hooks
  515. * Added DefaultRead/Write/Copy methods to base hook classes
  516. *
  517. * Revision 1.62  2002/08/26 18:32:24  grichenk
  518. * Added Get/SetAutoSeparator() to CObjectOStream to control
  519. * output of separators.
  520. *
  521. * Revision 1.61  2002/03/07 22:01:59  grichenk
  522. * Added "Separator" modifier for CObjectOStream
  523. *
  524. * Revision 1.60  2002/02/13 22:39:14  ucko
  525. * Support AIX.
  526. *
  527. * Revision 1.59  2001/10/17 20:41:19  grichenk
  528. * Added CObjectOStream::CharBlock class
  529. *
  530. * Revision 1.58  2001/05/17 14:59:47  lavr
  531. * Typos corrected
  532. *
  533. * Revision 1.57  2001/01/05 20:10:36  vasilche
  534. * CByteSource, CIStrBuffer, COStrBuffer, CLightString, CChecksum, CWeakMap
  535. * were moved to util.
  536. *
  537. * Revision 1.56  2000/12/26 22:23:45  vasilche
  538. * Fixed errors of compilation on Mac.
  539. *
  540. * Revision 1.55  2000/12/15 21:28:47  vasilche
  541. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  542. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  543. * TByte typedef replaced by Uint1.
  544. *
  545. * Revision 1.54  2000/12/15 15:38:00  vasilche
  546. * Added support of Int8 and long double.
  547. * Enum values now have type Int4 instead of long.
  548. *
  549. * Revision 1.53  2000/11/20 17:24:36  vasilche
  550. * Added prototypes of internal functions.
  551. *
  552. * Revision 1.52  2000/10/20 19:29:15  vasilche
  553. * Adapted for MSVC which doesn't like explicit operator templates.
  554. *
  555. * Revision 1.51  2000/10/20 15:51:27  vasilche
  556. * Fixed data error processing.
  557. * Added interface for constructing container objects directly into output stream.
  558. * object.hpp, object.inl and object.cpp were split to
  559. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  560. *
  561. * Revision 1.50  2000/10/17 18:45:25  vasilche
  562. * Added possibility to turn off object cross reference detection in
  563. * CObjectIStream and CObjectOStream.
  564. *
  565. * Revision 1.49  2000/10/13 16:28:31  vasilche
  566. * Reduced header dependency.
  567. * Avoid use of templates with virtual methods.
  568. * Reduced amount of different maps used.
  569. * All this lead to smaller compiled code size (libraries and programs).
  570. *
  571. * Revision 1.48  2000/10/04 19:18:54  vasilche
  572. * Fixed processing floating point data.
  573. *
  574. * Revision 1.47  2000/10/03 17:22:35  vasilche
  575. * Reduced header dependency.
  576. * Reduced size of debug libraries on WorkShop by 3 times.
  577. * Fixed tag allocation for parent classes.
  578. * Fixed CObject allocation/deallocation in streams.
  579. * Moved instantiation of several templates in separate source file.
  580. *
  581. * Revision 1.46  2000/09/29 16:18:14  vasilche
  582. * Fixed binary format encoding/decoding on 64 bit compulers.
  583. * Implemented CWeakMap<> for automatic cleaning map entries.
  584. * Added cleaning local hooks via CWeakMap<>.
  585. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  586. * Added some user interface methods to CObjectIStream, CObjectOStream and
  587. * CObjectStreamCopier.
  588. *
  589. * Revision 1.45  2000/09/18 20:00:06  vasilche
  590. * Separated CVariantInfo and CMemberInfo.
  591. * Implemented copy hooks.
  592. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  593. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  594. *
  595. * Revision 1.44  2000/09/01 13:16:01  vasilche
  596. * Implemented class/container/choice iterators.
  597. * Implemented CObjectStreamCopier for copying data without loading into memory.
  598. *
  599. * Revision 1.43  2000/08/15 19:44:41  vasilche
  600. * Added Read/Write hooks:
  601. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  602. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  603. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  604. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  605. *
  606. * Revision 1.42  2000/07/03 18:42:36  vasilche
  607. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  608. * Reduced header dependency.
  609. *
  610. * Revision 1.41  2000/06/16 16:31:07  vasilche
  611. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  612. *
  613. * Revision 1.40  2000/06/07 19:45:43  vasilche
  614. * Some code cleaning.
  615. * Macros renaming in more clear way.
  616. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  617. *
  618. * Revision 1.39  2000/06/01 19:06:57  vasilche
  619. * Added parsing of XML data.
  620. *
  621. * Revision 1.38  2000/05/24 20:08:13  vasilche
  622. * Implemented XML dump.
  623. *
  624. * Revision 1.37  2000/05/09 16:38:34  vasilche
  625. * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce possible errors.
  626. * Added write context to CObjectOStream.
  627. * Inlined most of methods of helping class Member, Block, ByteBlock etc.
  628. *
  629. * Revision 1.36  2000/05/04 16:22:23  vasilche
  630. * Cleaned and optimized blocks and members.
  631. *
  632. * Revision 1.35  2000/04/28 16:58:02  vasilche
  633. * Added classes CByteSource and CByteSourceReader for generic reading.
  634. * Added delayed reading of choice variants.
  635. *
  636. * Revision 1.34  2000/04/13 14:50:17  vasilche
  637. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  638. *
  639. * Revision 1.33  2000/04/06 16:10:51  vasilche
  640. * Fixed bug with iterators in choices.
  641. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  642. * Added output buffering to text ASN.1 data.
  643. *
  644. * Revision 1.32  2000/03/29 15:55:21  vasilche
  645. * Added two versions of object info - CObjectInfo and CConstObjectInfo.
  646. * Added generic iterators by class -
  647. *  CTypeIterator<class>, CTypeConstIterator<class>,
  648. *  CStdTypeIterator<type>, CStdTypeConstIterator<type>,
  649. *  CObjectsIterator and CObjectsConstIterator.
  650. *
  651. * Revision 1.31  2000/03/07 14:05:31  vasilche
  652. * Added stream buffering to ASN.1 binary input.
  653. * Optimized class loading/storing.
  654. * Fixed bugs in processing OPTIONAL fields.
  655. *
  656. * Revision 1.30  2000/01/10 20:12:37  vasilche
  657. * Fixed duplicate argument names.
  658. * Fixed conflict between template and variable name.
  659. *
  660. * Revision 1.29  2000/01/10 19:46:32  vasilche
  661. * Fixed encoding/decoding of REAL type.
  662. * Fixed encoding/decoding of StringStore.
  663. * Fixed encoding/decoding of NULL type.
  664. * Fixed error reporting.
  665. * Reduced object map (only classes).
  666. *
  667. * Revision 1.28  2000/01/05 19:43:46  vasilche
  668. * Fixed error messages when reading from ASN.1 binary file.
  669. * Fixed storing of integers with enumerated values in ASN.1 binary file.
  670. * Added TAG support to key/value of map.
  671. * Added support of NULL variant in CHOICE.
  672. *
  673. * Revision 1.27  1999/12/20 15:29:31  vasilche
  674. * Fixed bug with old ASN structures.
  675. *
  676. * Revision 1.26  1999/12/17 19:04:53  vasilche
  677. * Simplified generation of GetTypeInfo methods.
  678. *
  679. * Revision 1.25  1999/10/04 16:22:09  vasilche
  680. * Fixed bug with old ASN.1 structures.
  681. *
  682. * Revision 1.24  1999/09/27 14:17:59  vasilche
  683. * Fixed bug with overloaded constructors of Block.
  684. *
  685. * Revision 1.23  1999/09/24 18:19:14  vasilche
  686. * Removed dependency on NCBI toolkit.
  687. *
  688. * Revision 1.22  1999/09/23 18:56:53  vasilche
  689. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  690. *
  691. * Revision 1.21  1999/09/22 20:11:49  vasilche
  692. * Modified for compilation on IRIX native c++ compiler.
  693. *
  694. * Revision 1.20  1999/09/14 18:54:04  vasilche
  695. * Fixed bugs detected by gcc & egcs.
  696. * Removed unneeded includes.
  697. *
  698. * Revision 1.19  1999/08/16 16:07:43  vasilche
  699. * Added ENUMERATED type.
  700. *
  701. * Revision 1.18  1999/08/13 15:53:44  vasilche
  702. * C++ analog of asntool: datatool
  703. *
  704. * Revision 1.17  1999/07/22 17:33:43  vasilche
  705. * Unified reading/writing of objects in all three formats.
  706. *
  707. * Revision 1.16  1999/07/21 14:19:58  vasilche
  708. * Added serialization of bool.
  709. *
  710. * Revision 1.15  1999/07/19 15:50:17  vasilche
  711. * Added interface to old ASN.1 routines.
  712. * Added naming of key/value in STL map.
  713. *
  714. * Revision 1.14  1999/07/14 18:58:03  vasilche
  715. * Fixed ASN.1 types/field naming.
  716. *
  717. * Revision 1.13  1999/07/09 16:32:53  vasilche
  718. * Added OCTET STRING write/read.
  719. *
  720. * Revision 1.12  1999/07/07 21:15:03  vasilche
  721. * Cleaned processing of string types (string, char*, const char*).
  722. *
  723. * Revision 1.11  1999/07/02 21:31:46  vasilche
  724. * Implemented reading from ASN.1 binary format.
  725. *
  726. * Revision 1.10  1999/07/01 17:55:20  vasilche
  727. * Implemented ASN.1 binary write.
  728. *
  729. * Revision 1.9  1999/06/30 16:04:30  vasilche
  730. * Added support for old ASN.1 structures.
  731. *
  732. * Revision 1.8  1999/06/24 14:44:40  vasilche
  733. * Added binary ASN.1 output.
  734. *
  735. * Revision 1.7  1999/06/17 20:42:02  vasilche
  736. * Fixed storing/loading of pointers.
  737. *
  738. * Revision 1.6  1999/06/16 20:35:23  vasilche
  739. * Cleaned processing of blocks of data.
  740. * Added input from ASN.1 text format.
  741. *
  742. * Revision 1.5  1999/06/15 16:20:03  vasilche
  743. * Added ASN.1 object output stream.
  744. *
  745. * Revision 1.4  1999/06/10 21:06:40  vasilche
  746. * Working binary output and almost working binary input.
  747. *
  748. * Revision 1.3  1999/06/07 19:30:17  vasilche
  749. * More bug fixes
  750. *
  751. * Revision 1.2  1999/06/04 20:51:35  vasilche
  752. * First compilable version of serialization.
  753. *
  754. * Revision 1.1  1999/05/19 19:56:26  vasilche
  755. * Commit just in case.
  756. *
  757. * ===========================================================================
  758. */