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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: asntypes.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:38:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.42
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ASNTYPES__HPP
  10. #define ASNTYPES__HPP
  11. /*  $Id: asntypes.hpp,v 1000.3 2004/06/01 19:38:22 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. #if HAVE_NCBI_C
  43. #include <serial/typeinfo.hpp>
  44. #include <serial/serialutil.hpp>
  45. #include <serial/continfo.hpp>
  46. #include <serial/stdtypes.hpp>
  47. #include <serial/typeref.hpp>
  48. #include <serial/serialasndef.hpp>
  49. /** @addtogroup TypeInfoC
  50.  *
  51.  * @{
  52.  */
  53. struct valnode;
  54. struct bytestore;
  55. struct asnio;
  56. struct asntype;
  57. BEGIN_NCBI_SCOPE
  58. class NCBI_XSERIAL_EXPORT CSequenceOfTypeInfo : public CContainerTypeInfo {
  59.     typedef CContainerTypeInfo CParent;
  60. public:
  61.     typedef TObjectPtr TObjectType;
  62.     CSequenceOfTypeInfo(TTypeInfo type, bool randomOrder = false);
  63.     CSequenceOfTypeInfo(const char* name,
  64.                         TTypeInfo type, bool randomOrder = false);
  65.     CSequenceOfTypeInfo(const string& name,
  66.                         TTypeInfo type, bool randomOrder = false);
  67.     size_t GetNextOffset(void) const
  68.         {
  69.             return m_NextOffset;
  70.         }
  71.     size_t GetDataOffset(void) const
  72.         {
  73.             return m_DataOffset;
  74.         }
  75.     
  76.     static TObjectPtr& FirstNode(TObjectPtr object)
  77.         {
  78.             return CTypeConverter<TObjectPtr>::Get(object);
  79.         }
  80.     static TObjectPtr FirstNode(TConstObjectPtr object)
  81.         {
  82.             return CTypeConverter<TObjectPtr>::Get(object);
  83.         }
  84.     TObjectPtr& NextNode(TObjectPtr object) const
  85.         {
  86.             return CTypeConverter<TObjectPtr>::Get
  87.                 (CRawPointer::Add(object, m_NextOffset));
  88.         }
  89.     TObjectPtr NextNode(TConstObjectPtr object) const
  90.         {
  91.             return CTypeConverter<TObjectPtr>::Get
  92.                 (CRawPointer::Add(object, m_NextOffset));
  93.         }
  94.     TObjectPtr Data(TObjectPtr object) const
  95.         {
  96.             return CRawPointer::Add(object, m_DataOffset);
  97.         }
  98.     TConstObjectPtr Data(TConstObjectPtr object) const
  99.         {
  100.             return CRawPointer::Add(object, m_DataOffset);
  101.         }
  102.     static TTypeInfo GetTypeInfo(TTypeInfo base);
  103.     static CTypeInfo* CreateTypeInfo(TTypeInfo base);
  104.     virtual bool IsDefault(TConstObjectPtr object) const;
  105.     virtual void SetDefault(TObjectPtr dst) const;
  106.     virtual void Assign(TObjectPtr dst, TConstObjectPtr src,
  107.                         ESerialRecursionMode how = eRecursive) const;
  108.     TObjectPtr CreateNode(void) const;
  109.     void DeleteNode(TObjectPtr node) const;
  110. private:
  111.     void InitSequenceOfTypeInfo(void);
  112.     // set this sequence to have ValNode as data holder
  113.     // (used for SET OF (INTEGER, STRING, SET OF etc.)
  114.     void SetValNodeNext(void);
  115.     // SET OF CHOICE (use choice's valnode->next field as link)
  116.     void SetChoiceNext(void);
  117. private:
  118.     size_t m_NextOffset;  // offset in struct of pointer to next object (def 0)
  119.     size_t m_DataOffset;  // offset in struct of data struct (def 0)
  120. };
  121. class NCBI_XSERIAL_EXPORT CSetOfTypeInfo : public CSequenceOfTypeInfo {
  122.     typedef CSequenceOfTypeInfo CParent;
  123. public:
  124.     CSetOfTypeInfo(TTypeInfo type);
  125.     CSetOfTypeInfo(const char* name, TTypeInfo type);
  126.     CSetOfTypeInfo(const string& name, TTypeInfo type);
  127.     static TTypeInfo GetTypeInfo(TTypeInfo base);
  128.     static CTypeInfo* CreateTypeInfo(TTypeInfo base);
  129. };
  130. class NCBI_XSERIAL_EXPORT COctetStringTypeInfo : public CPrimitiveTypeInfo {
  131.     typedef CPrimitiveTypeInfo CParent;
  132. public:
  133.     typedef bytestore* TObjectType;
  134.     COctetStringTypeInfo(void);
  135.     static TObjectType& Get(TObjectPtr object)
  136.         {
  137.             return CTypeConverter<TObjectType>::Get(object);
  138.         }
  139.     static const TObjectType& Get(TConstObjectPtr object)
  140.         {
  141.             return CTypeConverter<TObjectType>::Get(object);
  142.         }
  143.     static TTypeInfo GetTypeInfo(void);
  144.     virtual bool IsDefault(TConstObjectPtr object) const;
  145.     virtual bool Equals(TConstObjectPtr obj1, TConstObjectPtr obj2,
  146.                         ESerialRecursionMode how = eRecursive) const;
  147.     virtual void SetDefault(TObjectPtr dst) const;
  148.     virtual void Assign(TObjectPtr dst, TConstObjectPtr src,
  149.                         ESerialRecursionMode how = eRecursive) const;
  150.     virtual void GetValueOctetString(TConstObjectPtr objectPtr,
  151.                                      vector<char>& value) const;
  152.     virtual void SetValueOctetString(TObjectPtr objectPtr,
  153.                                      const vector<char>& value) const;
  154. protected:
  155.     
  156.     static void ReadOctetString(CObjectIStream& in,
  157.                                 TTypeInfo objectType,
  158.                                 TObjectPtr objectPtr);
  159.     static void WriteOctetString(CObjectOStream& out,
  160.                                  TTypeInfo objectType,
  161.                                  TConstObjectPtr objectPtr);
  162.     static void SkipOctetString(CObjectIStream& in,
  163.                                 TTypeInfo objectType);
  164.     static void CopyOctetString(CObjectStreamCopier& copier,
  165.                                 TTypeInfo objectType);
  166. };
  167. class NCBI_XSERIAL_EXPORT COldAsnTypeInfo : public CPrimitiveTypeInfo
  168. {
  169.     typedef CPrimitiveTypeInfo CParent;
  170. public:
  171.     typedef void* TObjectType;
  172.     COldAsnTypeInfo(const char* name,
  173.                     TAsnNewProc newProc, TAsnFreeProc freeProc,
  174.                     TAsnReadProc readProc, TAsnWriteProc writeProc);
  175.     COldAsnTypeInfo(const string& name,
  176.                     TAsnNewProc newProc, TAsnFreeProc freeProc,
  177.                     TAsnReadProc readProc, TAsnWriteProc writeProc);
  178.     static TObjectType& Get(TObjectPtr object)
  179.         {
  180.             return CTypeConverter<TObjectType>::Get(object);
  181.         }
  182.     static const TObjectType& Get(TConstObjectPtr object)
  183.         {
  184.             return CTypeConverter<TObjectType>::Get(object);
  185.         }
  186.     virtual bool IsDefault(TConstObjectPtr object) const;
  187.     virtual bool Equals(TConstObjectPtr object1, TConstObjectPtr object2,
  188.                         ESerialRecursionMode how = eRecursive) const;
  189.     virtual void SetDefault(TObjectPtr dst) const;
  190.     virtual void Assign(TObjectPtr dst, TConstObjectPtr src,
  191.                  ESerialRecursionMode how = eRecursive) const;
  192. protected:
  193.     
  194.     static void ReadOldAsnStruct(CObjectIStream& in,
  195.                                  TTypeInfo objectType,
  196.                                  TObjectPtr objectPtr);
  197.     static void WriteOldAsnStruct(CObjectOStream& out,
  198.                                   TTypeInfo objectType,
  199.                                   TConstObjectPtr objectPtr);
  200. private:
  201.     TAsnNewProc m_NewProc;
  202.     TAsnFreeProc m_FreeProc;
  203.     TAsnReadProc m_ReadProc;
  204.     TAsnWriteProc m_WriteProc;
  205. };
  206. //#include <serial/asntypes.inl>
  207. END_NCBI_SCOPE
  208. #endif  /* HAVE_NCBI_C */
  209. #endif  /* ASNTYPES__HPP */
  210. /* @} */
  211. /*
  212.  * ---------------------------------------------------------------------------
  213.  * $Log: asntypes.hpp,v $
  214.  * Revision 1000.3  2004/06/01 19:38:22  gouriano
  215.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.42
  216.  *
  217.  * Revision 1.42  2004/04/27 21:44:56  jcherry
  218.  * Made a couple of typedefs public
  219.  *
  220.  * Revision 1.41  2004/03/25 15:56:27  gouriano
  221.  * Added possibility to copy and compare serial object non-recursively
  222.  *
  223.  * Revision 1.40  2003/12/01 19:04:21  grichenk
  224.  * Moved Add and Sub from serialutil to ncbimisc, made them methods
  225.  * of CRawPointer class.
  226.  *
  227.  * Revision 1.39  2003/04/15 14:14:51  siyan
  228.  * Added doxygen support
  229.  *
  230.  * Revision 1.38  2003/03/26 16:13:32  vasilche
  231.  * Removed TAB symbols. Some formatting.
  232.  *
  233.  * Revision 1.37  2002/12/23 18:38:50  dicuccio
  234.  * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  235.  * Moved all CVS logs to the end.
  236.  *
  237.  * Revision 1.36  2000/11/07 17:25:11  vasilche
  238.  * Fixed encoding of XML:
  239.  *     removed unnecessary apostrophes in OCTET STRING
  240.  *     removed unnecessary content in NULL
  241.  * Added module names to CTypeInfo and CEnumeratedTypeValues
  242.  *
  243.  * Revision 1.35  2000/10/13 16:28:28  vasilche
  244.  * Reduced header dependency.
  245.  * Avoid use of templates with virtual methods.
  246.  * Reduced amount of different maps used.
  247.  * All this lead to smaller compiled code size (libraries and programs).
  248.  *
  249.  * Revision 1.34  2000/09/19 20:16:52  vasilche
  250.  * Fixed type in CStlClassInfo_auto_ptr.
  251.  * Added missing include serialutil.hpp.
  252.  *
  253.  * Revision 1.33  2000/09/18 19:59:58  vasilche
  254.  * Separated CVariantInfo and CMemberInfo.
  255.  * Implemented copy hooks.
  256.  * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  257.  * Most type specific functions now are implemented via function pointers instead of virtual functions.
  258.  *
  259.  * Revision 1.32  2000/09/01 13:15:57  vasilche
  260.  * Implemented class/container/choice iterators.
  261.  * Implemented CObjectStreamCopier for copying data without loading into memory.
  262.  *
  263.  * Revision 1.31  2000/08/15 19:44:37  vasilche
  264.  * Added Read/Write hooks:
  265.  * CReadObjectHook/CWriteObjectHook for objects of specified type.
  266.  * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  267.  * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  268.  * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  269.  *
  270.  * Revision 1.30  2000/07/10 17:31:51  vasilche
  271.  * Macro arguments made more clear.
  272.  * All old ASN stuff moved to serialasn.hpp.
  273.  * Changed prefix of enum info functions to GetTypeInfo_enum_.
  274.  *
  275.  * Revision 1.29  2000/07/03 18:42:32  vasilche
  276.  * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  277.  * Reduced header dependency.
  278.  *
  279.  * Revision 1.28  2000/06/16 16:31:03  vasilche
  280.  * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  281.  *
  282.  * Revision 1.27  2000/06/07 19:45:41  vasilche
  283.  * Some code cleaning.
  284.  * Macros renaming in more clear way.
  285.  * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  286.  *
  287.  * Revision 1.26  2000/03/31 21:38:17  vasilche
  288.  * Renamed First() -> FirstNode(), Next() -> NextNode() to avoid name conflict.
  289.  *
  290.  * Revision 1.25  2000/03/07 14:05:27  vasilche
  291.  * Added stream buffering to ASN.1 binary input.
  292.  * Optimized class loading/storing.
  293.  * Fixed bugs in processing OPTIONAL fields.
  294.  *
  295.  * Revision 1.24  2000/02/17 20:02:26  vasilche
  296.  * Added some standard serialization exceptions.
  297.  * Optimized text/binary ASN.1 reading.
  298.  * Fixed wrong encoding of StringStore in ASN.1 binary format.
  299.  * Optimized logic of object collection.
  300.  *
  301.  * Revision 1.23  2000/02/01 21:44:33  vasilche
  302.  * Added CGeneratedChoiceTypeInfo for generated choice classes.
  303.  * Added buffering to CObjectIStreamAsn.
  304.  * Removed CMemberInfo subclasses.
  305.  * Added support for DEFAULT/OPTIONAL members.
  306. *
  307. * Revision 1.22  1999/12/28 18:55:39  vasilche
  308. * Reduced size of compiled object files:
  309. * 1. avoid inline or implicit virtual methods (especially destructors).
  310. * 2. avoid std::string's methods usage in inline methods.
  311. * 3. avoid string literals ("xxx") in inline methods.
  312. *
  313. * Revision 1.21  1999/12/17 19:04:51  vasilche
  314. * Simplified generation of GetTypeInfo methods.
  315. *
  316. * Revision 1.20  1999/11/22 21:04:32  vasilche
  317. * Cleaned main interface headers. Now generated files should include serial/serialimpl.hpp and user code should include serial/serial.hpp which became might lighter.
  318. *
  319. * Revision 1.19  1999/10/04 19:39:45  vasilche
  320. * Fixed bug in CObjectOStreamBinary.
  321. * Start using of BSRead/BSWrite.
  322. * Added ASNCALL macro for prototypes of old ASN.1 functions.
  323. *
  324. * Revision 1.18  1999/10/04 16:22:07  vasilche
  325. * Fixed bug with old ASN.1 structures.
  326. *
  327. * Revision 1.17  1999/09/29 22:36:30  vakatov
  328. * Dont forget to #include ncbistd.hpp before #ifdef HAVE_NCBI_C...
  329. *
  330. * Revision 1.16  1999/09/24 18:55:53  vasilche
  331. * ASN.1 types will not be compiled is we don't have NCBI toolkit.
  332. *
  333. * Revision 1.15  1999/09/24 18:19:12  vasilche
  334. * Removed dependency on NCBI toolkit.
  335. *
  336. * Revision 1.14  1999/09/23 18:56:51  vasilche
  337. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  338. *
  339. * Revision 1.13  1999/09/22 20:11:47  vasilche
  340. * Modified for compilation on IRIX native c++ compiler.
  341. *
  342. * Revision 1.12  1999/09/14 18:54:01  vasilche
  343. * Fixed bugs detected by gcc & egcs.
  344. * Removed unneeded includes.
  345. *
  346. * Revision 1.11  1999/08/16 16:07:42  vasilche
  347. * Added ENUMERATED type.
  348. *
  349. * Revision 1.10  1999/08/13 20:22:56  vasilche
  350. * Fixed lot of bugs in datatool
  351. *
  352. * Revision 1.9  1999/08/13 15:53:42  vasilche
  353. * C++ analog of asntool: datatool
  354. *
  355. * Revision 1.8  1999/07/19 15:50:14  vasilche
  356. * Added interface to old ASN.1 routines.
  357. * Added naming of key/value in STL map.
  358. *
  359. * Revision 1.7  1999/07/14 18:58:02  vasilche
  360. * Fixed ASN.1 types/field naming.
  361. *
  362. * Revision 1.6  1999/07/13 20:18:04  vasilche
  363. * Changed types naming.
  364. *
  365. * Revision 1.5  1999/07/09 16:32:53  vasilche
  366. * Added OCTET STRING write/read.
  367. *
  368. * Revision 1.4  1999/07/07 19:58:43  vasilche
  369. * Reduced amount of data allocated on heap
  370. * Cleaned ASN.1 structures info
  371. *
  372. * Revision 1.3  1999/07/01 17:55:16  vasilche
  373. * Implemented ASN.1 binary write.
  374. *
  375. * Revision 1.2  1999/06/30 18:54:53  vasilche
  376. * Fixed some errors under MSVS
  377. *
  378. * Revision 1.1  1999/06/30 16:04:18  vasilche
  379. * Added support for old ASN.1 structures.
  380. *
  381. * ===========================================================================
  382. */