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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: serialbase.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:39:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.32
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SERIALBASE__HPP
  10. #define SERIALBASE__HPP
  11. /*  $Id: serialbase.hpp,v 1000.3 2004/06/01 19:39:07 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. *   File to be included in all headers generated by datatool
  40. */
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiobj.hpp>
  43. #include <serial/exception.hpp>
  44. #include <serial/serialdef.hpp>
  45. #include <typeinfo>
  46. /** @addtogroup GenClassSupport
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. class CTypeInfo;
  52. class CClassTypeInfo;
  53. class CChoiceTypeInfo;
  54. class CEnumeratedTypeValues;
  55. // enum for choice classes generated by datatool
  56. enum EResetVariant {
  57.     eDoResetVariant,
  58.     eDoNotResetVariant
  59. };
  60. typedef void (*TPostReadFunction)(const CTypeInfo* info, void* object);
  61. typedef void (*TPreWriteFunction)(const CTypeInfo* info, const void* object);
  62. NCBI_XSERIAL_EXPORT
  63. void SetPostRead(CClassTypeInfo*  info, TPostReadFunction function);
  64. NCBI_XSERIAL_EXPORT
  65. void SetPostRead(CChoiceTypeInfo* info, TPostReadFunction function);
  66. NCBI_XSERIAL_EXPORT
  67. void SetPreWrite(CClassTypeInfo*  info, TPreWriteFunction function);
  68. NCBI_XSERIAL_EXPORT
  69. void SetPreWrite(CChoiceTypeInfo* info, TPreWriteFunction function);
  70. template<class Class>
  71. class CClassPostReadPreWrite
  72. {
  73. public:
  74.     static void PostRead(const CTypeInfo* /*info*/, void* object)
  75.         {
  76.             static_cast<Class*>(object)->PostRead();
  77.         }
  78.     static void PreWrite(const CTypeInfo* /*info*/, const void* object)
  79.         {
  80.             static_cast<const Class*>(object)->PreWrite();
  81.         }
  82. };
  83. // Base class for all serializable objects
  84. class NCBI_XSERIAL_EXPORT CSerialObject : public CObject
  85. {
  86. public:
  87.     CSerialObject(void);
  88.     virtual ~CSerialObject(void);
  89.     virtual const CTypeInfo* GetThisTypeInfo(void) const = 0;
  90.     virtual void Assign(const CSerialObject& source,
  91.                         ESerialRecursionMode how = eRecursive);
  92.     virtual bool Equals(const CSerialObject& object,
  93.                         ESerialRecursionMode how = eRecursive) const;
  94.     virtual void DebugDump(CDebugDumpContext ddc, unsigned int depth) const;
  95.     void ThrowUnassigned(TMemberIndex index) const;
  96.     // for all GetX() methods called in the current thread
  97.     static  void SetVerifyDataThread(ESerialVerifyData verify);
  98.     // for all GetX() methods called in the current process
  99.     static  void SetVerifyDataGlobal(ESerialVerifyData verify);
  100.     static const char* ms_UnassignedStr;
  101.     static const char  ms_UnassignedByte;
  102.     bool HasNamespaceName(void) const;
  103.     const string& GetNamespaceName(void) const;
  104.     void SetNamespaceName(const string& ns_name);
  105.     bool HasNamespacePrefix(void) const;
  106.     const string& GetNamespacePrefix(void) const;
  107.     void SetNamespacePrefix(const string& ns_prefix);
  108. private:
  109.     static ESerialVerifyData x_GetVerifyData(void);
  110.     static ESerialVerifyData ms_VerifyDataDefault;
  111. };
  112. class NCBI_XSERIAL_EXPORT CSerialAttribInfoItem
  113. {
  114. public:
  115.     CSerialAttribInfoItem(const string& name,
  116.                           const string& ns_name, const string& value);
  117.     CSerialAttribInfoItem(const CSerialAttribInfoItem& other);
  118.     virtual ~CSerialAttribInfoItem(void);
  119.     const string& GetName(void) const;
  120.     const string& GetNamespaceName(void) const;
  121.     const string& GetValue(void) const;
  122. private:
  123.     string m_Name;
  124.     string m_NsName;
  125.     string m_Value;
  126. };
  127. class NCBI_XSERIAL_EXPORT CAnyContentObject : public CSerialObject
  128. {
  129. public:
  130.     CAnyContentObject(void);
  131.     CAnyContentObject(const CAnyContentObject& other);
  132.     virtual ~CAnyContentObject(void);
  133.     virtual const CTypeInfo* GetThisTypeInfo(void) const
  134.     { return GetTypeInfo(); }
  135.     static const CTypeInfo* GetTypeInfo(void);
  136.     void Reset(void);
  137.     CAnyContentObject& operator= (const CAnyContentObject& other);
  138.     bool operator== (const CAnyContentObject& other) const;
  139.     void SetName(const string& name);
  140.     const string& GetName(void) const;
  141.     void SetValue(const string& value);
  142.     const string& GetValue(void) const;
  143.     void SetNamespaceName(const string& ns_name);
  144.     const string& GetNamespaceName(void) const;
  145.     void SetNamespacePrefix(const string& ns_prefix);
  146.     const string& GetNamespacePrefix(void) const;
  147.     void AddAttribute(const string& name,
  148.                       const string& ns_name, const string& value);
  149.     const vector<CSerialAttribInfoItem>& GetAttributes(void) const;
  150. private:
  151.     void x_Copy(const CAnyContentObject& other);
  152.     void x_Decode(const string& value);
  153.     string m_Name;
  154.     string m_Value;
  155.     string m_NsName;
  156.     string m_NsPrefix;
  157.     vector<CSerialAttribInfoItem> m_Attlist;
  158. };
  159. // Base class for user-defined serializable classes
  160. // to allow for objects assignment and comparison.
  161. // EXAMPLE:
  162. //   class CSeq_entry : public CSeq_entry_Base, CSerialUserOp
  163. //
  164. class NCBI_XSERIAL_EXPORT CSerialUserOp
  165. {
  166.     friend class CClassTypeInfo;
  167.     friend class CChoiceTypeInfo;
  168. protected:
  169.     // will be called after copying the datatool-generated members
  170.     virtual void UserOp_Assign(const CSerialUserOp& source) = 0;
  171.     // will be called after comparing the datatool-generated members
  172.     virtual bool UserOp_Equals(const CSerialUserOp& object) const = 0;
  173. };
  174. /////////////////////////////////////////////////////////////////////
  175. //
  176. // Alias wrapper templates
  177. //
  178. template <class TPrim>
  179. class CAliasBase
  180. {
  181. public:
  182.     typedef CAliasBase<TPrim> TThis;
  183.     CAliasBase(void) {}
  184.     explicit CAliasBase(const TPrim& value)
  185.         : m_Data(value) {}
  186.     const TPrim& Get(void) const
  187.         {
  188.             return m_Data;
  189.         }
  190.     TPrim& Set(void)
  191.         {
  192.             return m_Data;
  193.         }
  194.     void Set(const TPrim& value)
  195.         {
  196.             m_Data = value;
  197.         }
  198.     operator TPrim(void) const
  199.         {
  200.             return m_Data;
  201.         }
  202.     TThis& operator*(void)
  203.         {
  204.             return *this;
  205.         }
  206.     TThis* operator->(void)
  207.         {
  208.             return this;
  209.         }
  210.     bool operator<(const TPrim& value) const
  211.         {
  212.             return m_Data < value;
  213.         }
  214.     bool operator>(const TPrim& value) const
  215.         {
  216.             return m_Data > value;
  217.         }
  218.     bool operator==(const TPrim& value) const
  219.         {
  220.             return m_Data == value;
  221.         }
  222.     bool operator!=(const TPrim& value) const
  223.         {
  224.             return m_Data != value;
  225.         }
  226.     static TPointerOffsetType GetDataPtr(const TThis* alias)
  227.         {
  228.             return TPointerOffsetType(&alias->m_Data);
  229.         }
  230. protected:
  231.     TPrim m_Data;
  232. };
  233. template <class TStd>
  234. class CStdAliasBase : public CAliasBase<TStd>
  235. {
  236.     typedef CAliasBase<TStd> TParent;
  237.     typedef CStdAliasBase<TStd> TThis;
  238. public:
  239.     CStdAliasBase(void)
  240.         {
  241.             this->m_Data = 0;
  242.         }
  243.     explicit CStdAliasBase(const TStd& value)
  244.         : TParent(value) {}
  245. };
  246. template <class TString>
  247. class CStringAliasBase : public CAliasBase<TString>
  248. {
  249.     typedef CAliasBase<TString> TParent;
  250.     typedef CStringAliasBase<TString> TThis;
  251. public:
  252.     CStringAliasBase(void)
  253.         {
  254.         }
  255.     explicit CStringAliasBase(const TString& value)
  256.         : TParent(value) {}
  257. };
  258. /////////////////////////////////////////////////////////////////////
  259. //
  260. //  Assignment and comparison for serializable objects
  261. //
  262. template <class C>
  263. C& SerialAssign(C& dest, const C& src, ESerialRecursionMode how = eRecursive)
  264. {
  265.     if ( typeid(src) != typeid(dest) ) {
  266.         ERR_POST(Fatal <<
  267.                  "SerialAssign() -- Assignment of incompatible types: " <<
  268.                  typeid(dest).name() << " = " << typeid(src).name());
  269.     }
  270.     C::GetTypeInfo()->Assign(&dest, &src, how);
  271.     return dest;
  272. }
  273. template <class C>
  274. bool SerialEquals(const C& object1, const C& object2,
  275.                   ESerialRecursionMode how = eRecursive)
  276. {
  277.     if ( typeid(object1) != typeid(object2) ) {
  278.         ERR_POST(Fatal <<
  279.                  "SerialAssign() -- Can not compare types: " <<
  280.                  typeid(object1).name() << " == " << typeid(object2).name());
  281.     }
  282.     return C::GetTypeInfo()->Equals(&object1, &object2, how);
  283. }
  284. // create on heap a clone of the source object
  285. template <typename C>
  286. C* SerialClone(const C& src)
  287. {
  288.     typename C::TTypeInfo type = C::GetTypeInfo();
  289.     TObjectPtr obj = type->Create();
  290.     type->Assign(obj, &src);
  291.     return static_cast<C*>(obj);
  292. }
  293. /////////////////////////////////////////////////////////////////////////////
  294. //
  295. //  I/O stream manipulators and helpers for serializable objects
  296. //
  297. // Formatting
  298. NCBI_XSERIAL_EXPORT CNcbiIos& MSerial_AsnText(CNcbiIos& io);
  299. NCBI_XSERIAL_EXPORT CNcbiIos& MSerial_AsnBinary(CNcbiIos& io);
  300. NCBI_XSERIAL_EXPORT CNcbiIos& MSerial_Xml(CNcbiIos& io);
  301. // Class member assignment verification
  302. NCBI_XSERIAL_EXPORT CNcbiIos& MSerial_VerifyDefault(CNcbiIos& io);
  303. NCBI_XSERIAL_EXPORT CNcbiIos& MSerial_VerifyNo(CNcbiIos& io);
  304. NCBI_XSERIAL_EXPORT CNcbiIos& MSerial_VerifyYes(CNcbiIos& io);
  305. NCBI_XSERIAL_EXPORT CNcbiIos& MSerial_VerifyDefValue(CNcbiIos& io);
  306. // Input/output
  307. NCBI_XSERIAL_EXPORT CNcbiOstream& operator<< (CNcbiOstream& str, const CSerialObject& obj);
  308. NCBI_XSERIAL_EXPORT CNcbiIstream& operator>> (CNcbiIstream& str, CSerialObject& obj);
  309. END_NCBI_SCOPE
  310. // these methods must be defined in root namespace so they have prefix NCBISER
  311. // default functions do nothing
  312. template<class CInfo>
  313. inline
  314. void NCBISERSetPostRead(const void* /*object*/, CInfo* /*info*/)
  315. {
  316. }
  317. template<class CInfo>
  318. inline
  319. void NCBISERSetPreWrite(const void* /*object*/, CInfo* /*info*/)
  320. {
  321. }
  322. // define for declaring specific function
  323. #define NCBISER_HAVE_POST_READ(Class) 
  324. template<class CInfo> 
  325. inline 
  326. void NCBISERSetPostRead(const Class* /*object*/, CInfo* info) 
  327.     NCBI_NS_NCBI::SetPostRead 
  328.         (info, &NCBI_NS_NCBI::CClassPostReadPreWrite<Class>::PostRead);
  329. }
  330. #define NCBISER_HAVE_PRE_WRITE(Class) 
  331. template<class CInfo> 
  332. inline 
  333. void NCBISERSetPreWrite(const Class* /*object*/, CInfo* info) 
  334.     NCBI_NS_NCBI::SetPreWrite 
  335.         (info, &NCBI_NS_NCBI::CClassPostReadPreWrite<Class>::PreWrite);
  336. }
  337. #define DECLARE_INTERNAL_TYPE_INFO() 
  338.     typedef const NCBI_NS_NCBI::CTypeInfo* TTypeInfo; 
  339.     virtual TTypeInfo GetThisTypeInfo(void) const { return GetTypeInfo(); } 
  340.     static  TTypeInfo GetTypeInfo(void)
  341. #define ENUM_METHOD_NAME(EnumName) 
  342.     NCBI_NAME2(GetTypeInfo_enum_,EnumName)
  343. #define DECLARE_ENUM_INFO(EnumName) 
  344.     const NCBI_NS_NCBI::CEnumeratedTypeValues* ENUM_METHOD_NAME(EnumName)(void)
  345. #define DECLARE_INTERNAL_ENUM_INFO(EnumName) 
  346.     static DECLARE_ENUM_INFO(EnumName)
  347. #define DECLARE_STD_ALIAS_TYPE_INFO() 
  348.     static const NCBI_NS_NCBI::CTypeInfo* GetTypeInfo(void)
  349. #if HAVE_NCBI_C
  350. #define ASN_STRUCT_NAME(AsnStructName) NCBI_NAME2(struct_, AsnStructName)
  351. #define ASN_STRUCT_METHOD_NAME(AsnStructName) 
  352.     NCBI_NAME2(GetTypeInfo_struct_,AsnStructName)
  353. #define DECLARE_ASN_TYPE_INFO(AsnStructName) 
  354.     const NCBI_NS_NCBI::CTypeInfo* ASN_STRUCT_METHOD_NAME(AsnStructName)(void)
  355. #define DECLARE_ASN_STRUCT_INFO(AsnStructName) 
  356.     struct ASN_STRUCT_NAME(AsnStructName); 
  357.     DECLARE_ASN_TYPE_INFO(AsnStructName); 
  358.     inline 
  359.     const NCBI_NS_NCBI::CTypeInfo* 
  360.     GetAsnStructTypeInfo(const ASN_STRUCT_NAME(AsnStructName)* ) 
  361.     { 
  362.         return ASN_STRUCT_METHOD_NAME(AsnStructName)(); 
  363.     } 
  364.     struct ASN_STRUCT_NAME(AsnStructName)
  365. #define DECLARE_ASN_CHOICE_INFO(AsnChoiceName) 
  366.     DECLARE_ASN_TYPE_INFO(AsnChoiceName)
  367. #endif
  368. #endif  /* SERIALBASE__HPP */
  369. /* @} */
  370. /* ---------------------------------------------------------------------------
  371. * $Log: serialbase.hpp,v $
  372. * Revision 1000.3  2004/06/01 19:39:07  gouriano
  373. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.32
  374. *
  375. * Revision 1.32  2004/05/22 20:19:17  jcherry
  376. * Made CAliasBase::TThis typedef public
  377. *
  378. * Revision 1.31  2004/04/26 16:40:59  ucko
  379. * Tweak for GCC 3.4 compatibility.
  380. *
  381. * Revision 1.30  2004/03/25 15:56:28  gouriano
  382. * Added possibility to copy and compare serial object non-recursively
  383. *
  384. * Revision 1.29  2004/02/02 14:39:52  vasilche
  385. * Removed call to string::resize(0) in constructor - it's empty by default.
  386. *
  387. * Revision 1.28  2004/01/20 14:58:46  dicuccio
  388. * FIxed use of export specifiers - located before return type of function
  389. *
  390. * Revision 1.27  2004/01/16 21:50:41  gouriano
  391. * added export specifiers to i/o manipulators
  392. *
  393. * Revision 1.25  2003/11/13 14:06:44  gouriano
  394. * Elaborated data verification on read/write/get to enable skipping mandatory class data members
  395. *
  396. * Revision 1.24  2003/10/21 13:48:47  grichenk
  397. * Redesigned type aliases in serialization library.
  398. * Fixed the code (removed CRef-s, added explicit
  399. * initializers etc.)
  400. *
  401. * Revision 1.23  2003/09/22 20:57:07  gouriano
  402. * Changed base type of AnyContent object to CSerialObject
  403. *
  404. * Revision 1.22  2003/09/16 14:49:15  gouriano
  405. * Enhanced AnyContent objects to support XML namespaces and attribute info items.
  406. *
  407. * Revision 1.21  2003/08/25 15:58:32  gouriano
  408. * added possibility to use namespaces in XML i/o streams
  409. *
  410. * Revision 1.20  2003/08/13 15:47:02  gouriano
  411. * implemented serialization of AnyContent objects
  412. *
  413. * Revision 1.19  2003/04/29 18:29:06  gouriano
  414. * object data member initialization verification
  415. *
  416. * Revision 1.18  2003/04/15 16:18:48  siyan
  417. * Added doxygen support
  418. *
  419. * Revision 1.17  2003/03/28 18:52:04  dicuccio
  420. * Added Win32 exports for postread/postwrite set hooks
  421. *
  422. * Revision 1.16  2003/03/25 13:08:42  dicuccio
  423. * Added missing NCBI_NS_NCBI:: in PostRead()/PostWrite() macros
  424. *
  425. * Revision 1.15  2003/03/11 18:00:08  gouriano
  426. * reimplement CInvalidChoiceSelection exception
  427. *
  428. * Revision 1.14  2002/12/23 18:38:51  dicuccio
  429. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  430. * Moved all CVS logs to the end.
  431. *
  432. * Revision 1.13  2002/05/29 21:18:43  gouriano
  433. * added debug dump
  434. *
  435. * Revision 1.12  2002/05/22 14:03:37  grichenk
  436. * CSerialUserOp -- added prefix UserOp_ to Assign() and Equals()
  437. *
  438. * Revision 1.11  2002/05/15 20:22:02  grichenk
  439. * Added CSerialObject -- base class for all generated ASN.1 classes
  440. *
  441. * Revision 1.10  2001/07/25 19:15:27  grichenk
  442. * Added comments. Added type checking before dynamic cast.
  443. *
  444. * Revision 1.9  2001/07/16 16:22:47  grichenk
  445. * Added CSerialUserOp class to create Assign() and Equals() methods for
  446. * user-defind classes.
  447. * Added SerialAssign<>() and SerialEquals<>() functions.
  448. *
  449. * Revision 1.8  2000/12/15 21:28:49  vasilche
  450. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  451. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  452. * TByte typedef replaced by Uint1.
  453. *
  454. * Revision 1.7  2000/07/12 13:30:56  vasilche
  455. * Typo in function prototype.
  456. *
  457. * Revision 1.6  2000/07/11 20:34:51  vasilche
  458. * File included in all generated headers made lighter.
  459. * Nonnecessary code moved to serialimpl.hpp.
  460. *
  461. * Revision 1.5  2000/07/10 17:59:30  vasilche
  462. * Moved macros needed in headers to serialbase.hpp.
  463. * Use DECLARE_ENUM_INFO in generated code.
  464. *
  465. * Revision 1.4  2000/06/16 16:31:07  vasilche
  466. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  467. *
  468. * Revision 1.3  2000/05/04 16:21:36  vasilche
  469. * Fixed bug in choice reset.
  470. *
  471. * Revision 1.2  2000/04/28 16:58:03  vasilche
  472. * Added classes CByteSource and CByteSourceReader for generic reading.
  473. * Added delayed reading of choice variants.
  474. *
  475. * Revision 1.1  2000/04/03 18:47:09  vasilche
  476. * Added main include file for generated headers.
  477. * serialimpl.hpp is included in generated sources with GetTypeInfo methods
  478. *
  479. * ===========================================================================
  480. */