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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: typeinfo.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/04/12 17:16:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.46
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef TYPEINFO__HPP
  10. #define TYPEINFO__HPP
  11. /*  $Id: typeinfo.hpp,v 1000.3 2004/04/12 17:16: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 <serial/serialdef.hpp>
  43. #include <serial/hookdata.hpp>
  44. #include <serial/hookfunc.hpp>
  45. /** @addtogroup TypeInfoCPP
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. class CObject;
  51. class CObjectIStream;
  52. class CObjectOStream;
  53. class CObjectStreamCopier;
  54. class CClassTypeInfo;
  55. class CObjectTypeInfo;
  56. class CConstObjectInfo;
  57. class CObjectInfo;
  58. class CReadObjectHook;
  59. class CWriteObjectHook;
  60. class CSkipObjectHook;
  61. class CCopyObjectHook;
  62. class CTypeInfoFunctions;
  63. class CNamespaceInfoItem;
  64. // CTypeInfo class contains all information about C++ types (both basic and
  65. // classes): members and layout in memory.
  66. class NCBI_XSERIAL_EXPORT CTypeInfo
  67. {
  68. protected:
  69.     CTypeInfo(ETypeFamily typeFamily, size_t size);
  70.     CTypeInfo(ETypeFamily typeFamily, size_t size, const char* name);
  71.     CTypeInfo(ETypeFamily typeFamily, size_t size, const string& name);
  72. public:
  73.     // various function pointers
  74.     typedef TObjectPtr (*TTypeCreate)(TTypeInfo objectType);
  75.     virtual ~CTypeInfo(void);
  76.     ETypeFamily GetTypeFamily(void) const;
  77.     // name of this type
  78.     const string& GetName(void) const;
  79.     // namespace name
  80.     bool HasNamespaceName(void) const;
  81.     const string& GetNamespaceName(void) const;
  82.     void SetNamespaceName(const string& ns_name) const;
  83.     // namespace prefix
  84.     bool HasNamespacePrefix(void) const;
  85.     const string& GetNamespacePrefix(void) const;
  86.     void SetNamespacePrefix(const string& ns_prefix) const;
  87.     // name of module
  88.     virtual const string& GetModuleName(void) const;
  89.     void SetModuleName(const string& name);
  90.     void SetModuleName(const char* name);
  91.     // size of data object in memory (like sizeof in C)
  92.     size_t GetSize(void) const;
  93.     // creates object of this type in heap (can be deleted by operator delete)
  94.     TObjectPtr Create(void) const;
  95.     // deletes object
  96.     virtual void Delete(TObjectPtr object) const;
  97.     // clear object contents so Delete will not leave unused memory allocated
  98.     // note: object contents is not guaranteed to be in initial state
  99.     //       (as after Create), to do so you should call SetDefault after
  100.     virtual void DeleteExternalObjects(TObjectPtr object) const;
  101.     // check, whether object contains default value
  102.     virtual bool IsDefault(TConstObjectPtr object) const = 0;
  103.     // check if both objects contain the same values
  104.     virtual bool Equals(TConstObjectPtr object1, TConstObjectPtr object2,
  105.                         ESerialRecursionMode how = eRecursive) const = 0;
  106.     // set object to default value
  107.     virtual void SetDefault(TObjectPtr dst) const = 0;
  108.     // set object to copy of another one
  109.     virtual void Assign(TObjectPtr dst, TConstObjectPtr src,
  110.                         ESerialRecursionMode how = eRecursive) const = 0;
  111.     // return true if type is inherited from CObject
  112.     bool IsCObject(void) const;
  113.     virtual const CObject* GetCObjectPtr(TConstObjectPtr objectPtr) const;
  114.     // return true CTypeInfo of object (redefined in polymorphic classes)
  115.     virtual TTypeInfo GetRealTypeInfo(TConstObjectPtr object) const;
  116.     // I/O interface:
  117.     void ReadData(CObjectIStream& in, TObjectPtr object) const;
  118.     void WriteData(CObjectOStream& out, TConstObjectPtr object) const;
  119.     void CopyData(CObjectStreamCopier& copier) const;
  120.     void SkipData(CObjectIStream& in) const;
  121.     virtual bool IsParentClassOf(const CClassTypeInfo* classInfo) const;
  122.     virtual bool IsType(TTypeInfo type) const;
  123.     virtual bool MayContainType(TTypeInfo type) const;
  124.     bool IsOrMayContainType(TTypeInfo type) const;
  125.     // hooks
  126.     void SetGlobalReadHook(CReadObjectHook* hook);
  127.     void SetLocalReadHook(CObjectIStream& in, CReadObjectHook* hook);
  128.     void ResetGlobalReadHook(void);
  129.     void ResetLocalReadHook(CObjectIStream& in);
  130.     void SetPathReadHook(CObjectIStream* in, const string& path,
  131.                          CReadObjectHook* hook);
  132.     void SetGlobalWriteHook(CWriteObjectHook* hook);
  133.     void SetLocalWriteHook(CObjectOStream& out, CWriteObjectHook* hook);
  134.     void ResetGlobalWriteHook(void);
  135.     void ResetLocalWriteHook(CObjectOStream& out);
  136.     void SetPathWriteHook(CObjectOStream* out, const string& path,
  137.                           CWriteObjectHook* hook);
  138.     void SetGlobalSkipHook(CSkipObjectHook* hook);
  139.     void SetLocalSkipHook(CObjectIStream& in, CSkipObjectHook* hook);
  140.     void ResetGlobalSkipHook(void);
  141.     void ResetLocalSkipHook(CObjectIStream& in);
  142.     void SetPathSkipHook(CObjectIStream* in, const string& path,
  143.                          CSkipObjectHook* hook);
  144.     void SetGlobalCopyHook(CCopyObjectHook* hook);
  145.     void SetLocalCopyHook(CObjectStreamCopier& copier, CCopyObjectHook* hook);
  146.     void ResetGlobalCopyHook(void);
  147.     void ResetLocalCopyHook(CObjectStreamCopier& copier);
  148.     void SetPathCopyHook(CObjectStreamCopier* copier, const string& path,
  149.                          CCopyObjectHook* hook);
  150.     // default methods without checking hook
  151.     void DefaultReadData(CObjectIStream& in, TObjectPtr object) const;
  152.     void DefaultWriteData(CObjectOStream& out, TConstObjectPtr object) const;
  153.     void DefaultCopyData(CObjectStreamCopier& copier) const;
  154.     void DefaultSkipData(CObjectIStream& in) const;
  155. private:
  156.     // private constructors to avoid copying
  157.     CTypeInfo(const CTypeInfo&);
  158.     CTypeInfo& operator=(const CTypeInfo&);
  159.     // type information
  160.     ETypeFamily m_TypeFamily;
  161.     size_t m_Size;
  162.     string m_Name;
  163.     string m_ModuleName;
  164.     mutable CNamespaceInfoItem* m_InfoItem;
  165. protected:
  166.     void SetCreateFunction(TTypeCreate func);
  167.     void SetReadFunction(TTypeReadFunction func);
  168.     void SetWriteFunction(TTypeWriteFunction func);
  169.     void SetCopyFunction(TTypeCopyFunction func);
  170.     void SetSkipFunction(TTypeSkipFunction func);
  171.     bool m_IsCObject;
  172. private:
  173.     // type specific function pointers
  174.     TTypeCreate m_CreateFunction;
  175.     CHookData<CReadObjectHook, TTypeReadFunction> m_ReadHookData;
  176.     CHookData<CWriteObjectHook, TTypeWriteFunction> m_WriteHookData;
  177.     CHookData<CSkipObjectHook, TTypeSkipFunction> m_SkipHookData;
  178.     CHookData<CCopyObjectHook, TTypeCopyFunction> m_CopyHookData;
  179.     friend class CTypeInfoFunctions;
  180.     void x_CreateInfoItemIfNeeded(void) const;
  181. };
  182. /* @} */
  183. #include <serial/typeinfo.inl>
  184. END_NCBI_SCOPE
  185. #endif  /* TYPEINFO__HPP */
  186. /* ---------------------------------------------------------------------------
  187. * $Log: typeinfo.hpp,v $
  188. * Revision 1000.3  2004/04/12 17:16:02  gouriano
  189. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.46
  190. *
  191. * Revision 1.46  2004/03/25 15:57:55  gouriano
  192. * Added possibility to copy and compare serial object non-recursively
  193. *
  194. * Revision 1.45  2004/01/05 14:24:09  gouriano
  195. * Added possibility to set serialization hooks by stack path
  196. *
  197. * Revision 1.44  2003/11/24 14:10:04  grichenk
  198. * Changed base class for CAliasTypeInfo to CPointerTypeInfo
  199. *
  200. * Revision 1.43  2003/11/18 18:11:47  grichenk
  201. * Resolve aliased type info before using it in CObjectTypeInfo
  202. *
  203. * Revision 1.42  2003/09/16 14:49:15  gouriano
  204. * Enhanced AnyContent objects to support XML namespaces and attribute info items.
  205. *
  206. * Revision 1.41  2003/08/25 15:58:32  gouriano
  207. * added possibility to use namespaces in XML i/o streams
  208. *
  209. * Revision 1.40  2003/07/29 18:47:46  vasilche
  210. * Fixed thread safeness of object stream hooks.
  211. *
  212. * Revision 1.39  2003/04/15 16:19:06  siyan
  213. * Added doxygen support
  214. *
  215. * Revision 1.38  2002/12/23 18:38:51  dicuccio
  216. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  217. * Moved all CVS logs to the end.
  218. *
  219. * Revision 1.37  2002/09/09 18:14:00  grichenk
  220. * Added CObjectHookGuard class.
  221. * Added methods to be used by hooks for data
  222. * reading and skipping.
  223. *
  224. * Revision 1.36  2001/10/22 15:16:20  grichenk
  225. * Optimized CTypeInfo::IsCObject()
  226. *
  227. * Revision 1.35  2001/05/17 14:59:47  lavr
  228. * Typos corrected
  229. *
  230. * Revision 1.34  2000/11/07 17:25:13  vasilche
  231. * Fixed encoding of XML:
  232. *     removed unnecessary apostrophes in OCTET STRING
  233. *     removed unnecessary content in NULL
  234. * Added module names to CTypeInfo and CEnumeratedTypeValues
  235. *
  236. * Revision 1.33  2000/10/03 17:22:36  vasilche
  237. * Reduced header dependency.
  238. * Reduced size of debug libraries on WorkShop by 3 times.
  239. * Fixed tag allocation for parent classes.
  240. * Fixed CObject allocation/deallocation in streams.
  241. * Moved instantiation of several templates in separate source file.
  242. *
  243. * Revision 1.32  2000/09/29 16:18:15  vasilche
  244. * Fixed binary format encoding/decoding on 64 bit compulers.
  245. * Implemented CWeakMap<> for automatic cleaning map entries.
  246. * Added cleaning local hooks via CWeakMap<>.
  247. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  248. * Added some user interface methods to CObjectIStream, CObjectOStream and
  249. * CObjectStreamCopier.
  250. *
  251. * Revision 1.31  2000/09/18 20:00:11  vasilche
  252. * Separated CVariantInfo and CMemberInfo.
  253. * Implemented copy hooks.
  254. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  255. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  256. *
  257. * Revision 1.30  2000/09/01 13:16:04  vasilche
  258. * Implemented class/container/choice iterators.
  259. * Implemented CObjectStreamCopier for copying data without loading into memory.
  260. *
  261. * Revision 1.29  2000/08/15 19:44:43  vasilche
  262. * Added Read/Write hooks:
  263. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  264. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  265. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  266. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  267. *
  268. * Revision 1.28  2000/07/03 18:42:38  vasilche
  269. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  270. * Reduced header dependency.
  271. *
  272. * Revision 1.27  2000/06/16 16:31:08  vasilche
  273. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  274. *
  275. * Revision 1.26  2000/05/24 20:08:16  vasilche
  276. * Implemented XML dump.
  277. *
  278. * Revision 1.25  2000/05/09 16:38:34  vasilche
  279. * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce possible errors.
  280. * Added write context to CObjectOStream.
  281. * Inlined most of methods of helping class Member, Block, ByteBlock etc.
  282. *
  283. * Revision 1.24  2000/03/29 15:55:22  vasilche
  284. * Added two versions of object info - CObjectInfo and CConstObjectInfo.
  285. * Added generic iterators by class -
  286. *  CTypeIterator<class>, CTypeConstIterator<class>,
  287. *  CStdTypeIterator<type>, CStdTypeConstIterator<type>,
  288. *  CObjectsIterator and CObjectsConstIterator.
  289. *
  290. * Revision 1.23  2000/03/14 14:43:30  vasilche
  291. * Fixed error reporting.
  292. *
  293. * Revision 1.22  2000/03/07 14:05:33  vasilche
  294. * Added stream buffering to ASN.1 binary input.
  295. * Optimized class loading/storing.
  296. * Fixed bugs in processing OPTIONAL fields.
  297. *
  298. * Revision 1.21  2000/02/17 20:02:30  vasilche
  299. * Added some standard serialization exceptions.
  300. * Optimized text/binary ASN.1 reading.
  301. * Fixed wrong encoding of StringStore in ASN.1 binary format.
  302. * Optimized logic of object collection.
  303. *
  304. * Revision 1.20  1999/12/28 18:55:40  vasilche
  305. * Reduced size of compiled object files:
  306. * 1. avoid inline or implicit virtual methods (especially destructors).
  307. * 2. avoid std::string's methods usage in inline methods.
  308. * 3. avoid string literals ("xxx") in inline methods.
  309. *
  310. * Revision 1.19  1999/12/17 19:04:55  vasilche
  311. * Simplified generation of GetTypeInfo methods.
  312. *
  313. * Revision 1.18  1999/09/22 20:11:51  vasilche
  314. * Modified for compilation on IRIX native c++ compiler.
  315. *
  316. * Revision 1.17  1999/09/14 18:54:07  vasilche
  317. * Fixed bugs detected by gcc & egcs.
  318. * Removed unneeded includes.
  319. *
  320. * Revision 1.16  1999/08/31 17:50:05  vasilche
  321. * Implemented several macros for specific data types.
  322. * Added implicit members.
  323. * Added multimap and set.
  324. *
  325. * Revision 1.15  1999/07/20 18:22:57  vasilche
  326. * Added interface to old ASN.1 routines.
  327. * Added fixed choice of subclasses to use for pointers.
  328. *
  329. * Revision 1.14  1999/07/19 15:50:22  vasilche
  330. * Added interface to old ASN.1 routines.
  331. * Added naming of key/value in STL map.
  332. *
  333. * Revision 1.13  1999/07/13 20:18:10  vasilche
  334. * Changed types naming.
  335. *
  336. * Revision 1.12  1999/07/07 19:58:47  vasilche
  337. * Reduced amount of data allocated on heap
  338. * Cleaned ASN.1 structures info
  339. *
  340. * Revision 1.11  1999/07/07 18:18:32  vasilche
  341. * Fixed some bugs found by MS VC++
  342. *
  343. * Revision 1.10  1999/07/01 17:55:23  vasilche
  344. * Implemented ASN.1 binary write.
  345. *
  346. * Revision 1.9  1999/06/30 18:54:55  vasilche
  347. * Fixed some errors under MSVS
  348. *
  349. * Revision 1.8  1999/06/30 16:04:39  vasilche
  350. * Added support for old ASN.1 structures.
  351. *
  352. * Revision 1.7  1999/06/24 14:44:47  vasilche
  353. * Added binary ASN.1 output.
  354. *
  355. * Revision 1.6  1999/06/15 16:20:09  vasilche
  356. * Added ASN.1 object output stream.
  357. *
  358. * Revision 1.5  1999/06/10 21:06:42  vasilche
  359. * Working binary output and almost working binary input.
  360. *
  361. * Revision 1.4  1999/06/07 19:59:38  vasilche
  362. * offset_t -> size_t
  363. *
  364. * Revision 1.3  1999/06/07 19:30:21  vasilche
  365. * More bug fixes
  366. *
  367. * Revision 1.2  1999/06/04 20:51:40  vasilche
  368. * First compilable version of serialization.
  369. *
  370. * Revision 1.1  1999/05/19 19:56:32  vasilche
  371. * Commit just in case.
  372. *
  373. * ===========================================================================
  374. */