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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: classinfo.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:14:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.45
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CLASSINFO__HPP
  10. #define CLASSINFO__HPP
  11. /*  $Id: classinfo.hpp,v 1000.1 2004/04/12 17:14:24 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/classinfob.hpp>
  43. #include <serial/member.hpp>
  44. #include <list>
  45. /** @addtogroup TypeInfoCPP
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. class CObjectIStream;
  51. class CObjectOStream;
  52. class COObjectList;
  53. class CMemberId;
  54. class CMemberInfo;
  55. class CClassInfoHelperBase;
  56. class NCBI_XSERIAL_EXPORT CClassTypeInfo : public CClassTypeInfoBase
  57. {
  58.     typedef CClassTypeInfoBase CParent;
  59. protected:
  60.     typedef const type_info* (*TGetTypeIdFunction)(TConstObjectPtr object);
  61.     enum EClassType {
  62.         eSequential,
  63.         eRandom,
  64.         eImplicit
  65.     };
  66.     friend class CClassInfoHelperBase;
  67.     CClassTypeInfo(size_t size, const char* name,
  68.                    const void* nonCObject, TTypeCreate createFunc,
  69.                    const type_info& ti, TGetTypeIdFunction idFunc);
  70.     CClassTypeInfo(size_t size, const char* name,
  71.                    const CObject* cObject, TTypeCreate createFunc,
  72.                    const type_info& ti, TGetTypeIdFunction idFunc);
  73.     CClassTypeInfo(size_t size, const string& name,
  74.                    const void* nonCObject, TTypeCreate createFunc,
  75.                    const type_info& ti, TGetTypeIdFunction idFunc);
  76.     CClassTypeInfo(size_t size, const string& name,
  77.                    const CObject* cObject, TTypeCreate createFunc,
  78.                    const type_info& ti, TGetTypeIdFunction idFunc);
  79. public:
  80.     typedef list<pair<CMemberId, CTypeRef> > TSubClasses;
  81.     const CItemsInfo& GetMembers(void) const;
  82.     const CMemberInfo* GetMemberInfo(TMemberIndex index) const;
  83.     const CMemberInfo* GetMemberInfo(const CIterator& i) const;
  84.     const CMemberInfo* GetMemberInfo(const string& name) const;
  85.     virtual bool IsDefault(TConstObjectPtr object) const;
  86.     virtual bool Equals(TConstObjectPtr object1, TConstObjectPtr object2,
  87.                         ESerialRecursionMode how = eRecursive) const;
  88.     virtual void SetDefault(TObjectPtr dst) const;
  89.     virtual void Assign(TObjectPtr dst, TConstObjectPtr src,
  90.                         ESerialRecursionMode how = eRecursive) const;
  91.     bool RandomOrder(void) const;
  92.     CClassTypeInfo* SetRandomOrder(bool random = true);
  93.     bool Implicit(void) const;
  94.     CClassTypeInfo* SetImplicit(void);
  95.     bool IsImplicitNonEmpty(void) const;
  96.     void AddSubClass(const CMemberId& id, const CTypeRef& type);
  97.     void AddSubClass(const char* id, TTypeInfoGetter getter);
  98.     void AddSubClassNull(const CMemberId& id);
  99.     void AddSubClassNull(const char* id);
  100.     const TSubClasses* SubClasses(void) const;
  101.     const CClassTypeInfo* GetParentClassInfo(void) const;
  102.     void SetParentClass(TTypeInfo parentClass);
  103. public:
  104.     // iterators interface
  105.     const type_info* GetCPlusPlusTypeInfo(TConstObjectPtr object) const;
  106. protected:
  107.     void AssignMemberDefault(TObjectPtr object, const CMemberInfo* info) const;
  108.     void AssignMemberDefault(TObjectPtr object, TMemberIndex index) const;
  109.     
  110.     virtual bool IsType(TTypeInfo typeInfo) const;
  111.     virtual bool IsParentClassOf(const CClassTypeInfo* classInfo) const;
  112.     virtual bool CalcMayContainType(TTypeInfo typeInfo) const;
  113.     virtual TTypeInfo GetRealTypeInfo(TConstObjectPtr object) const;
  114.     void RegisterSubClasses(void) const;
  115. private:
  116.     void InitClassTypeInfo(void);
  117.     EClassType m_ClassType;
  118.     const CClassTypeInfo* m_ParentClassInfo;
  119.     auto_ptr<TSubClasses> m_SubClasses;
  120.     TGetTypeIdFunction m_GetTypeIdFunction;
  121.     const CMemberInfo* GetImplicitMember(void) const;
  122. private:
  123.     void UpdateFunctions(void);
  124.     static void ReadClassSequential(CObjectIStream& in,
  125.                                     TTypeInfo objectType,
  126.                                     TObjectPtr objectPtr);
  127.     static void ReadClassRandom(CObjectIStream& in,
  128.                                 TTypeInfo objectType,
  129.                                 TObjectPtr objectPtr);
  130.     static void ReadImplicitMember(CObjectIStream& in,
  131.                                    TTypeInfo objectType,
  132.                                    TObjectPtr objectPtr);
  133.     static void WriteClassRandom(CObjectOStream& out,
  134.                                  TTypeInfo objectType,
  135.                                  TConstObjectPtr objectPtr);
  136.     static void WriteClassSequential(CObjectOStream& out,
  137.                                      TTypeInfo objectType,
  138.                                      TConstObjectPtr objectPtr);
  139.     static void WriteImplicitMember(CObjectOStream& out,
  140.                                     TTypeInfo objectType,
  141.                                     TConstObjectPtr objectPtr);
  142.     static void SkipClassSequential(CObjectIStream& in,
  143.                                     TTypeInfo objectType);
  144.     static void SkipClassRandom(CObjectIStream& in,
  145.                                 TTypeInfo objectType);
  146.     static void SkipImplicitMember(CObjectIStream& in,
  147.                                    TTypeInfo objectType);
  148.     static void CopyClassSequential(CObjectStreamCopier& copier,
  149.                                     TTypeInfo objectType);
  150.     static void CopyClassRandom(CObjectStreamCopier& copier,
  151.                                 TTypeInfo objectType);
  152.     static void CopyImplicitMember(CObjectStreamCopier& copier,
  153.                                    TTypeInfo objectType);
  154. };
  155. /* @} */
  156. #include <serial/classinfo.inl>
  157. END_NCBI_SCOPE
  158. #endif  /* CLASSINFO__HPP */
  159. /* ---------------------------------------------------------------------------
  160. * $Log: classinfo.hpp,v $
  161. * Revision 1000.1  2004/04/12 17:14:24  gouriano
  162. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.45
  163. *
  164. * Revision 1.45  2004/03/25 15:56:27  gouriano
  165. * Added possibility to copy and compare serial object non-recursively
  166. *
  167. * Revision 1.44  2003/06/24 20:54:13  gouriano
  168. * corrected code generation and serialization of non-empty unnamed containers (XML)
  169. *
  170. * Revision 1.43  2003/04/29 18:29:06  gouriano
  171. * object data member initialization verification
  172. *
  173. * Revision 1.42  2003/04/15 14:14:57  siyan
  174. * Added doxygen support
  175. *
  176. * Revision 1.41  2003/04/10 20:13:37  vakatov
  177. * Rollback the "uninitialized member" verification -- it still needs to
  178. * be worked upon...
  179. *
  180. * Revision 1.39  2002/12/26 19:33:06  gouriano
  181. * changed XML I/O streams to properly handle object copying
  182. *
  183. * Revision 1.38  2002/12/23 18:38:50  dicuccio
  184. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  185. * Moved all CVS logs to the end.
  186. *
  187. * Revision 1.37  2002/11/14 20:44:09  gouriano
  188. * moved AddMember method into the base class
  189. *
  190. * Revision 1.36  2000/10/13 16:28:29  vasilche
  191. * Reduced header dependency.
  192. * Avoid use of templates with virtual methods.
  193. * Reduced amount of different maps used.
  194. * All this lead to smaller compiled code size (libraries and programs).
  195. *
  196. * Revision 1.35  2000/10/03 17:22:30  vasilche
  197. * Reduced header dependency.
  198. * Reduced size of debug libraries on WorkShop by 3 times.
  199. * Fixed tag allocation for parent classes.
  200. * Fixed CObject allocation/deallocation in streams.
  201. * Moved instantiation of several templates in separate source file.
  202. *
  203. * Revision 1.34  2000/09/18 19:59:59  vasilche
  204. * Separated CVariantInfo and CMemberInfo.
  205. * Implemented copy hooks.
  206. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  207. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  208. *
  209. * Revision 1.33  2000/09/01 13:15:58  vasilche
  210. * Implemented class/container/choice iterators.
  211. * Implemented CObjectStreamCopier for copying data without loading into memory.
  212. *
  213. * Revision 1.32  2000/07/03 18:42:32  vasilche
  214. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  215. * Reduced header dependency.
  216. *
  217. * Revision 1.31  2000/06/16 16:31:04  vasilche
  218. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  219. *
  220. * Revision 1.30  2000/06/01 19:06:55  vasilche
  221. * Added parsing of XML data.
  222. *
  223. * Revision 1.29  2000/05/24 20:08:11  vasilche
  224. * Implemented XML dump.
  225. *
  226. * Revision 1.28  2000/04/03 18:47:09  vasilche
  227. * Added main include file for generated headers.
  228. * serialimpl.hpp is included in generated sources with GetTypeInfo methods
  229. *
  230. * Revision 1.27  2000/03/29 15:55:19  vasilche
  231. * Added two versions of object info - CObjectInfo and CConstObjectInfo.
  232. * Added generic iterators by class -
  233. *  CTypeIterator<class>, CTypeConstIterator<class>,
  234. *  CStdTypeIterator<type>, CStdTypeConstIterator<type>,
  235. *  CObjectsIterator and CObjectsConstIterator.
  236. *
  237. * Revision 1.26  2000/03/07 14:05:29  vasilche
  238. * Added stream buffering to ASN.1 binary input.
  239. * Optimized class loading/storing.
  240. * Fixed bugs in processing OPTIONAL fields.
  241. *
  242. * Revision 1.25  2000/02/17 20:02:27  vasilche
  243. * Added some standard serialization exceptions.
  244. * Optimized text/binary ASN.1 reading.
  245. * Fixed wrong encoding of StringStore in ASN.1 binary format.
  246. * Optimized logic of object collection.
  247. *
  248. * Revision 1.24  2000/02/01 21:44:34  vasilche
  249. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  250. * Added buffering to CObjectIStreamAsn.
  251. * Removed CMemberInfo subclasses.
  252. * Added support for DEFAULT/OPTIONAL members.
  253. *
  254. * Revision 1.23  2000/01/10 19:46:30  vasilche
  255. * Fixed encoding/decoding of REAL type.
  256. * Fixed encoding/decoding of StringStore.
  257. * Fixed encoding/decoding of NULL type.
  258. * Fixed error reporting.
  259. * Reduced object map (only classes).
  260. *
  261. * Revision 1.22  2000/01/05 19:43:43  vasilche
  262. * Fixed error messages when reading from ASN.1 binary file.
  263. * Fixed storing of integers with enumerated values in ASN.1 binary file.
  264. * Added TAG support to key/value of map.
  265. * Added support of NULL variant in CHOICE.
  266. *
  267. * Revision 1.21  1999/12/17 19:04:52  vasilche
  268. * Simplified generation of GetTypeInfo methods.
  269. *
  270. * Revision 1.20  1999/10/04 16:22:08  vasilche
  271. * Fixed bug with old ASN.1 structures.
  272. *
  273. * Revision 1.19  1999/09/14 18:54:02  vasilche
  274. * Fixed bugs detected by gcc & egcs.
  275. * Removed unneeded includes.
  276. *
  277. * Revision 1.18  1999/09/01 17:37:59  vasilche
  278. * Fixed vector<char> implementation.
  279. * Added explicit naming of class info.
  280. * Moved IMPLICIT attribute from member info to class info.
  281. *
  282. * Revision 1.17  1999/08/31 17:50:03  vasilche
  283. * Implemented several macros for specific data types.
  284. * Added implicit members.
  285. * Added multimap and set.
  286. *
  287. * Revision 1.16  1999/08/13 20:22:57  vasilche
  288. * Fixed lot of bugs in datatool
  289. *
  290. * Revision 1.15  1999/08/13 15:53:42  vasilche
  291. * C++ analog of asntool: datatool
  292. *
  293. * Revision 1.14  1999/07/20 18:22:53  vasilche
  294. * Added interface to old ASN.1 routines.
  295. * Added fixed choice of subclasses to use for pointers.
  296. *
  297. * Revision 1.13  1999/07/13 20:18:04  vasilche
  298. * Changed types naming.
  299. *
  300. * Revision 1.12  1999/07/07 19:58:44  vasilche
  301. * Reduced amount of data allocated on heap
  302. * Cleaned ASN.1 structures info
  303. *
  304. * Revision 1.11  1999/07/07 18:18:32  vasilche
  305. * Fixed some bugs found by MS VC++
  306. *
  307. * Revision 1.10  1999/07/01 17:55:17  vasilche
  308. * Implemented ASN.1 binary write.
  309. *
  310. * Revision 1.9  1999/06/30 16:04:20  vasilche
  311. * Added support for old ASN.1 structures.
  312. *
  313. * Revision 1.8  1999/06/24 14:44:37  vasilche
  314. * Added binary ASN.1 output.
  315. *
  316. * Revision 1.7  1999/06/17 18:38:48  vasilche
  317. * Fixed order of members in class.
  318. * Added checks for overlapped members.
  319. *
  320. * Revision 1.6  1999/06/15 16:20:00  vasilche
  321. * Added ASN.1 object output stream.
  322. *
  323. * Revision 1.5  1999/06/10 21:06:37  vasilche
  324. * Working binary output and almost working binary input.
  325. *
  326. * Revision 1.4  1999/06/07 20:42:58  vasilche
  327. * Fixed compilation under MS VS
  328. *
  329. * Revision 1.3  1999/06/07 19:59:37  vasilche
  330. * offset_t -> size_t
  331. *
  332. * Revision 1.2  1999/06/04 20:51:31  vasilche
  333. * First compilable version of serialization.
  334. *
  335. * Revision 1.1  1999/05/19 19:56:23  vasilche
  336. * Commit just in case.
  337. *
  338. * ===========================================================================
  339. */