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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objectinfo.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:38:44  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTINFO__HPP
  10. #define OBJECTINFO__HPP
  11. /*  $Id: objectinfo.hpp,v 1000.2 2004/06/01 19:38:44 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/ncbiobj.hpp>
  43. #include <serial/serialdef.hpp>
  44. #include <serial/typeinfo.hpp>
  45. #include <serial/continfo.hpp>
  46. #include <serial/ptrinfo.hpp>
  47. #include <serial/stdtypes.hpp>
  48. #include <serial/classinfob.hpp>
  49. #include <serial/classinfo.hpp>
  50. #include <serial/choice.hpp>
  51. #include <vector>
  52. #include <memory>
  53. /** @addtogroup UserCodeSupport
  54.  *
  55.  * @{
  56.  */
  57. BEGIN_NCBI_SCOPE
  58. class CObjectTypeInfo;
  59. class CConstObjectInfo;
  60. class CObjectInfo;
  61. class CPrimitiveTypeInfo;
  62. class CClassTypeInfoBase;
  63. class CClassTypeInfo;
  64. class CChoiceTypeInfo;
  65. class CContainerTypeInfo;
  66. class CPointerTypeInfo;
  67. class CMemberId;
  68. class CItemInfo;
  69. class CMemberInfo;
  70. class CVariantInfo;
  71. class CReadContainerElementHook;
  72. class CObjectTypeInfoMI;
  73. class CObjectTypeInfoVI;
  74. class CObjectTypeInfoCV;
  75. class CConstObjectInfoMI;
  76. class CConstObjectInfoCV;
  77. class CConstObjectInfoEI;
  78. class CObjectInfoMI;
  79. class CObjectInfoCV;
  80. class CObjectInfoEI;
  81. class NCBI_XSERIAL_EXPORT CObjectTypeInfo
  82. {
  83. public:
  84.     typedef CObjectTypeInfoMI CMemberIterator;
  85.     typedef CObjectTypeInfoVI CVariantIterator;
  86.     typedef CObjectTypeInfoCV CChoiceVariant;
  87.     CObjectTypeInfo(TTypeInfo typeinfo = 0);
  88.     ETypeFamily GetTypeFamily(void) const;
  89.     bool Valid(void) const;
  90.     operator bool(void) const;
  91.     bool operator!(void) const;
  92.     
  93.     bool operator==(const CObjectTypeInfo& type) const;
  94.     bool operator!=(const CObjectTypeInfo& type) const;
  95.     // primitive type interface
  96.     // only when GetTypeFamily() == CTypeInfo::eTypePrimitive
  97.     EPrimitiveValueType GetPrimitiveValueType(void) const;
  98.     bool IsPrimitiveValueSigned(void) const;
  99.     // container interface
  100.     // only when GetTypeFamily() == CTypeInfo::eTypeContainer
  101.     CObjectTypeInfo GetElementType(void) const;
  102.     // class interface
  103.     // only when GetTypeFamily() == CTypeInfo::eTypeClass
  104.     CMemberIterator BeginMembers(void) const;
  105.     CMemberIterator FindMember(const string& memberName) const;
  106.     CMemberIterator FindMemberByTag(int memberTag) const;
  107.     // choice interface
  108.     // only when GetTypeFamily() == CTypeInfo::eTypeChoice
  109.     CVariantIterator BeginVariants(void) const;
  110.     CVariantIterator FindVariant(const string& memberName) const;
  111.     CVariantIterator FindVariantByTag(int memberTag) const;
  112.     // pointer interface
  113.     // only when GetTypeFamily() == CTypeInfo::eTypePointer
  114.     CObjectTypeInfo GetPointedType(void) const;
  115.     void SetLocalReadHook(CObjectIStream& stream,
  116.                           CReadObjectHook* hook) const;
  117.     void SetGlobalReadHook(CReadObjectHook* hook) const;
  118.     void ResetLocalReadHook(CObjectIStream& stream) const;
  119.     void ResetGlobalReadHook(void) const;
  120.     void SetPathReadHook(CObjectIStream* stream, const string& path,
  121.                          CReadObjectHook* hook) const;
  122.     void SetLocalWriteHook(CObjectOStream& stream,
  123.                           CWriteObjectHook* hook) const;
  124.     void SetGlobalWriteHook(CWriteObjectHook* hook) const;
  125.     void ResetLocalWriteHook(CObjectOStream& stream) const;
  126.     void ResetGlobalWriteHook(void) const;
  127.     void SetPathWriteHook(CObjectOStream* stream, const string& path,
  128.                           CWriteObjectHook* hook) const;
  129.     void SetLocalSkipHook(CObjectIStream& stream,
  130.                           CSkipObjectHook* hook) const;
  131.     void SetGlobalSkipHook(CSkipObjectHook* hook) const;
  132.     void ResetLocalSkipHook(CObjectIStream& stream) const;
  133.     void ResetGlobalSkipHook(void) const;
  134.     void SetPathSkipHook(CObjectIStream* stream, const string& path,
  135.                          CSkipObjectHook* hook) const;
  136.     void SetLocalCopyHook(CObjectStreamCopier& stream,
  137.                           CCopyObjectHook* hook) const;
  138.     void SetGlobalCopyHook(CCopyObjectHook* hook) const;
  139.     void ResetLocalCopyHook(CObjectStreamCopier& stream) const;
  140.     void ResetGlobalCopyHook(void) const;
  141.     void SetPathCopyHook(CObjectStreamCopier* stream, const string& path,
  142.                          CCopyObjectHook* hook) const;
  143. public: // mostly for internal use
  144.     TTypeInfo GetTypeInfo(void) const;
  145.     const CPrimitiveTypeInfo* GetPrimitiveTypeInfo(void) const;
  146.     const CClassTypeInfo* GetClassTypeInfo(void) const;
  147.     const CChoiceTypeInfo* GetChoiceTypeInfo(void) const;
  148.     const CContainerTypeInfo* GetContainerTypeInfo(void) const;
  149.     const CPointerTypeInfo* GetPointerTypeInfo(void) const;
  150.     TMemberIndex FindMemberIndex(const string& name) const;
  151.     TMemberIndex FindMemberIndex(int tag) const;
  152.     TMemberIndex FindVariantIndex(const string& name) const;
  153.     TMemberIndex FindVariantIndex(int tag) const;
  154.     CMemberIterator GetMemberIterator(TMemberIndex index) const;
  155.     CVariantIterator GetVariantIterator(TMemberIndex index) const;
  156. protected:
  157.     void ResetTypeInfo(void);
  158.     void SetTypeInfo(TTypeInfo typeinfo);
  159.     void CheckTypeFamily(ETypeFamily family) const;
  160.     void WrongTypeFamily(ETypeFamily needFamily) const;
  161. private:
  162.     TTypeInfo m_TypeInfo;
  163. private:
  164.     CTypeInfo* GetNCTypeInfo(void) const;
  165. };
  166. class NCBI_XSERIAL_EXPORT CConstObjectInfo : public CObjectTypeInfo
  167. {
  168. public:
  169.     typedef TConstObjectPtr TObjectPtrType;
  170.     typedef CConstObjectInfoEI CElementIterator;
  171.     typedef CConstObjectInfoMI CMemberIterator;
  172.     typedef CConstObjectInfoCV CChoiceVariant;
  173.     
  174.     enum ENonCObject {
  175.         eNonCObject
  176.     };
  177.     // create empty CObjectInfo
  178.     CConstObjectInfo(void);
  179.     // initialize CObjectInfo
  180.     CConstObjectInfo(TConstObjectPtr objectPtr, TTypeInfo typeInfo);
  181.     CConstObjectInfo(pair<TConstObjectPtr, TTypeInfo> object);
  182.     CConstObjectInfo(pair<TObjectPtr, TTypeInfo> object);
  183.     // initialize CObjectInfo when we are sure that object 
  184.     // is not inherited from CObject (for efficiency)
  185.     CConstObjectInfo(TConstObjectPtr objectPtr, TTypeInfo typeInfo,
  186.                      ENonCObject nonCObject);
  187.     // reset CObjectInfo to empty state
  188.     void Reset(void);
  189.     // set CObjectInfo
  190.     CConstObjectInfo& operator=(pair<TConstObjectPtr, TTypeInfo> object);
  191.     CConstObjectInfo& operator=(pair<TObjectPtr, TTypeInfo> object);
  192.     // check if CObjectInfo initialized with valid object
  193.     bool Valid(void) const;
  194.     operator bool(void) const;
  195.     bool operator!(void) const;
  196.     void ResetObjectPtr(void);
  197.     // get pointer to object
  198.     TConstObjectPtr GetObjectPtr(void) const;
  199.     pair<TConstObjectPtr, TTypeInfo> GetPair(void) const;
  200.     // primitive type interface
  201.     bool GetPrimitiveValueBool(void) const;
  202.     char GetPrimitiveValueChar(void) const;
  203.     Int4 GetPrimitiveValueInt4(void) const;
  204.     Uint4 GetPrimitiveValueUint4(void) const;
  205.     Int8 GetPrimitiveValueInt8(void) const;
  206.     Uint8 GetPrimitiveValueUint8(void) const;
  207.     int GetPrimitiveValueInt(void) const;
  208.     unsigned GetPrimitiveValueUInt(void) const;
  209.     long GetPrimitiveValueLong(void) const;
  210.     unsigned long GetPrimitiveValueULong(void) const;
  211.     double GetPrimitiveValueDouble(void) const;
  212.     void GetPrimitiveValueString(string& value) const;
  213.     string GetPrimitiveValueString(void) const;
  214.     void GetPrimitiveValueOctetString(vector<char>& value) const;
  215.     // class interface
  216.     CMemberIterator GetMember(CObjectTypeInfo::CMemberIterator m) const;
  217.     CMemberIterator BeginMembers(void) const;
  218.     CMemberIterator GetClassMemberIterator(TMemberIndex index) const;
  219.     CMemberIterator FindClassMember(const string& memberName) const;
  220.     CMemberIterator FindClassMemberByTag(int memberTag) const;
  221.     // choice interface
  222.     TMemberIndex GetCurrentChoiceVariantIndex(void) const;
  223.     CChoiceVariant GetCurrentChoiceVariant(void) const;
  224.     // pointer interface
  225.     CConstObjectInfo GetPointedObject(void) const;
  226.     
  227.     // container interface
  228.     CElementIterator BeginElements(void) const;
  229. protected:
  230.     void Set(TConstObjectPtr objectPtr, TTypeInfo typeInfo);
  231.     
  232. private:
  233.     TConstObjectPtr m_ObjectPtr; // object pointer
  234.     CConstRef<CObject> m_Ref; // hold reference to CObject for correct removal
  235. };
  236. class NCBI_XSERIAL_EXPORT CObjectInfo : public CConstObjectInfo
  237. {
  238.     typedef CConstObjectInfo CParent;
  239. public:
  240.     typedef TObjectPtr TObjectPtrType;
  241.     typedef CObjectInfoEI CElementIterator;
  242.     typedef CObjectInfoMI CMemberIterator;
  243.     typedef CObjectInfoCV CChoiceVariant;
  244.     // create empty CObjectInfo
  245.     CObjectInfo(void);
  246.     // initialize CObjectInfo
  247.     CObjectInfo(TObjectPtr objectPtr, TTypeInfo typeInfo);
  248.     CObjectInfo(pair<TObjectPtr, TTypeInfo> object);
  249.     // initialize CObjectInfo when we are sure that object 
  250.     // is not inherited from CObject (for efficiency)
  251.     CObjectInfo(TObjectPtr objectPtr, TTypeInfo typeInfo,
  252.                 ENonCObject nonCObject);
  253.     // create CObjectInfo with new object
  254.     explicit CObjectInfo(TTypeInfo typeInfo);
  255.     // set CObjectInfo to point to another object
  256.     CObjectInfo& operator=(pair<TObjectPtr, TTypeInfo> object);
  257.     
  258.     // get pointer to object
  259.     TObjectPtr GetObjectPtr(void) const;
  260.     pair<TObjectPtr, TTypeInfo> GetPair(void) const;
  261.     // primitive type interface
  262.     void SetPrimitiveValueBool(bool value);
  263.     void SetPrimitiveValueChar(char value);
  264.     void SetPrimitiveValueLong(long value);
  265.     void SetPrimitiveValueULong(unsigned long value);
  266.     void SetPrimitiveValueDouble(double value);
  267.     void SetPrimitiveValueString(const string& value);
  268.     void SetPrimitiveValueOctetString(const vector<char>& value);
  269.     // class interface
  270.     CMemberIterator GetMember(CObjectTypeInfo::CMemberIterator m) const;
  271.     CMemberIterator BeginMembers(void) const;
  272.     CMemberIterator GetClassMemberIterator(TMemberIndex index) const;
  273.     CMemberIterator FindClassMember(const string& memberName) const;
  274.     CMemberIterator FindClassMemberByTag(int memberTag) const;
  275.     // choice interface
  276.     CChoiceVariant GetCurrentChoiceVariant(void) const;
  277.     // pointer interface
  278.     CObjectInfo GetPointedObject(void) const;
  279.     // container interface
  280.     CElementIterator BeginElements(void) const;
  281.     void ReadContainer(CObjectIStream& in, CReadContainerElementHook& hook);
  282. };
  283. /* @} */
  284. #include <serial/objectinfo.inl>
  285. END_NCBI_SCOPE
  286. #endif  /* OBJECTINFO__HPP */
  287. /* ---------------------------------------------------------------------------
  288. * $Log: objectinfo.hpp,v $
  289. * Revision 1000.2  2004/06/01 19:38:44  gouriano
  290. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  291. *
  292. * Revision 1.9  2004/04/30 13:29:09  gouriano
  293. * Remove obsolete function declarations
  294. *
  295. * Revision 1.8  2004/01/05 14:24:08  gouriano
  296. * Added possibility to set serialization hooks by stack path
  297. *
  298. * Revision 1.7  2003/07/29 18:47:46  vasilche
  299. * Fixed thread safeness of object stream hooks.
  300. *
  301. * Revision 1.6  2003/04/15 16:18:11  siyan
  302. * Added doxygen support
  303. *
  304. * Revision 1.5  2002/12/23 18:38:51  dicuccio
  305. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  306. * Moved all CVS logs to the end.
  307. *
  308. * Revision 1.4  2001/05/17 14:57:17  lavr
  309. * Typos corrected
  310. *
  311. * Revision 1.3  2001/01/22 23:20:30  vakatov
  312. * + CObjectInfo::GetMember(), CConstObjectInfo::GetMember()
  313. *
  314. * Revision 1.2  2000/12/15 15:37:59  vasilche
  315. * Added support of Int8 and long double.
  316. * Enum values now have type Int4 instead of long.
  317. *
  318. * Revision 1.1  2000/10/20 15:51:24  vasilche
  319. * Fixed data error processing.
  320. * Added interface for constructing container objects directly into output stream.
  321. * object.hpp, object.inl and object.cpp were split to
  322. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  323. *
  324. * ===========================================================================
  325. */