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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ptrinfo.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:41:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.35
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ptrinfo.cpp,v 1000.3 2004/06/01 19:41:34 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   !!! PUT YOUR DESCRIPTION HERE !!!
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: ptrinfo.cpp,v $
  41. * Revision 1000.3  2004/06/01 19:41:34  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.35
  43. *
  44. * Revision 1.35  2004/05/17 21:03:03  gorelenk
  45. * Added include of PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.34  2004/03/25 15:57:08  gouriano
  48. * Added possibility to copy and compare serial object non-recursively
  49. *
  50. * Revision 1.33  2003/11/24 14:10:05  grichenk
  51. * Changed base class for CAliasTypeInfo to CPointerTypeInfo
  52. *
  53. * Revision 1.32  2003/08/14 20:03:58  vasilche
  54. * Avoid memory reallocation when reading over preallocated object.
  55. * Simplified CContainerTypeInfo iterators interface.
  56. *
  57. * Revision 1.31  2003/03/20 20:42:36  vasilche
  58. * Reuse old object in CRef<> reader.
  59. *
  60. * Revision 1.30  2000/10/17 18:45:36  vasilche
  61. * Added possibility to turn off object cross reference detection in
  62. * CObjectIStream and CObjectOStream.
  63. *
  64. * Revision 1.29  2000/10/13 16:28:40  vasilche
  65. * Reduced header dependency.
  66. * Avoid use of templates with virtual methods.
  67. * Reduced amount of different maps used.
  68. * All this lead to smaller compiled code size (libraries and programs).
  69. *
  70. * Revision 1.28  2000/09/18 20:00:25  vasilche
  71. * Separated CVariantInfo and CMemberInfo.
  72. * Implemented copy hooks.
  73. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  74. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  75. *
  76. * Revision 1.27  2000/09/13 15:10:15  vasilche
  77. * Fixed type detection in type iterators.
  78. *
  79. * Revision 1.26  2000/09/01 13:16:20  vasilche
  80. * Implemented class/container/choice iterators.
  81. * Implemented CObjectStreamCopier for copying data without loading into memory.
  82. *
  83. * Revision 1.25  2000/08/15 19:44:51  vasilche
  84. * Added Read/Write hooks:
  85. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  86. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  87. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  88. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  89. *
  90. * Revision 1.24  2000/07/03 18:42:47  vasilche
  91. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  92. * Reduced header dependency.
  93. *
  94. * Revision 1.23  2000/06/16 16:31:22  vasilche
  95. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  96. *
  97. * Revision 1.22  2000/06/07 19:46:00  vasilche
  98. * Some code cleaning.
  99. * Macros renaming in more clear way.
  100. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  101. *
  102. * Revision 1.21  2000/05/24 20:08:49  vasilche
  103. * Implemented XML dump.
  104. *
  105. * Revision 1.20  2000/04/10 21:01:49  vasilche
  106. * Fixed Erase for map/set.
  107. * Added iteratorbase.hpp header for basic internal classes.
  108. *
  109. * Revision 1.19  2000/04/06 16:11:00  vasilche
  110. * Fixed bug with iterators in choices.
  111. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  112. * Added output buffering to text ASN.1 data.
  113. *
  114. * Revision 1.18  2000/03/29 15:55:29  vasilche
  115. * Added two versions of object info - CObjectInfo and CConstObjectInfo.
  116. * Added generic iterators by class -
  117. *  CTypeIterator<class>, CTypeConstIterator<class>,
  118. *  CStdTypeIterator<type>, CStdTypeConstIterator<type>,
  119. *  CObjectsIterator and CObjectsConstIterator.
  120. *
  121. * Revision 1.17  2000/03/07 14:06:23  vasilche
  122. * Added stream buffering to ASN.1 binary input.
  123. * Optimized class loading/storing.
  124. * Fixed bugs in processing OPTIONAL fields.
  125. * Added generation of reference counted objects.
  126. *
  127. * Revision 1.16  2000/02/17 20:02:45  vasilche
  128. * Added some standard serialization exceptions.
  129. * Optimized text/binary ASN.1 reading.
  130. * Fixed wrong encoding of StringStore in ASN.1 binary format.
  131. * Optimized logic of object collection.
  132. *
  133. * Revision 1.15  1999/12/28 18:55:52  vasilche
  134. * Reduced size of compiled object files:
  135. * 1. avoid inline or implicit virtual methods (especially destructors).
  136. * 2. avoid std::string's methods usage in inline methods.
  137. * 3. avoid string literals ("xxx") in inline methods.
  138. *
  139. * Revision 1.14  1999/12/17 19:05:04  vasilche
  140. * Simplified generation of GetTypeInfo methods.
  141. *
  142. * Revision 1.13  1999/10/28 15:37:41  vasilche
  143. * Fixed null choice pointers handling.
  144. * Cleaned enumertion interface.
  145. *
  146. * Revision 1.12  1999/10/25 19:07:15  vasilche
  147. * Fixed coredump on non initialized choices.
  148. * Fixed compilation warning.
  149. *
  150. * Revision 1.11  1999/09/14 18:54:20  vasilche
  151. * Fixed bugs detected by gcc & egcs.
  152. * Removed unneeded includes.
  153. *
  154. * Revision 1.10  1999/08/31 17:50:09  vasilche
  155. * Implemented several macros for specific data types.
  156. * Added implicit members.
  157. * Added multimap and set.
  158. *
  159. * Revision 1.9  1999/08/13 15:53:52  vasilche
  160. * C++ analog of asntool: datatool
  161. *
  162. * Revision 1.8  1999/07/20 18:23:13  vasilche
  163. * Added interface to old ASN.1 routines.
  164. * Added fixed choice of subclasses to use for pointers.
  165. *
  166. * Revision 1.7  1999/07/13 20:18:22  vasilche
  167. * Changed types naming.
  168. *
  169. * Revision 1.6  1999/07/07 19:59:08  vasilche
  170. * Reduced amount of data allocated on heap
  171. * Cleaned ASN.1 structures info
  172. *
  173. * Revision 1.5  1999/06/30 16:05:04  vasilche
  174. * Added support for old ASN.1 structures.
  175. *
  176. * Revision 1.4  1999/06/24 14:45:01  vasilche
  177. * Added binary ASN.1 output.
  178. *
  179. * Revision 1.3  1999/06/15 16:19:52  vasilche
  180. * Added ASN.1 object output stream.
  181. *
  182. * Revision 1.2  1999/06/07 20:42:58  vasilche
  183. * Fixed compilation under MS VS
  184. *
  185. * Revision 1.1  1999/06/04 20:51:48  vasilche
  186. * First compilable version of serialization.
  187. *
  188. * ===========================================================================
  189. */
  190. #include <ncbi_pch.hpp>
  191. #include <serial/ptrinfo.hpp>
  192. #include <serial/objostr.hpp>
  193. #include <serial/objistr.hpp>
  194. #include <serial/objcopy.hpp>
  195. #include <serial/serialutil.hpp>
  196. BEGIN_NCBI_SCOPE
  197. CPointerTypeInfo::CPointerTypeInfo(TTypeInfo type)
  198.     : CParent(eTypeFamilyPointer, sizeof(TObjectPtr)), m_DataTypeRef(type)
  199. {
  200.     InitPointerTypeInfoFunctions();
  201. }
  202. CPointerTypeInfo::CPointerTypeInfo(const CTypeRef& typeRef)
  203.     : CParent(eTypeFamilyPointer, sizeof(TObjectPtr)), m_DataTypeRef(typeRef)
  204. {
  205.     InitPointerTypeInfoFunctions();
  206. }
  207. CPointerTypeInfo::CPointerTypeInfo(size_t size, TTypeInfo type)
  208.     : CParent(eTypeFamilyPointer, size), m_DataTypeRef(type)
  209. {
  210.     InitPointerTypeInfoFunctions();
  211. }
  212. CPointerTypeInfo::CPointerTypeInfo(size_t size, const CTypeRef& typeRef)
  213.     : CParent(eTypeFamilyPointer, size), m_DataTypeRef(typeRef)
  214. {
  215.     InitPointerTypeInfoFunctions();
  216. }
  217. CPointerTypeInfo::CPointerTypeInfo(const string& name, TTypeInfo type)
  218.     : CParent(eTypeFamilyPointer, sizeof(TObjectPtr), name),
  219.       m_DataTypeRef(type)
  220. {
  221.     InitPointerTypeInfoFunctions();
  222. }
  223. CPointerTypeInfo::CPointerTypeInfo(const string& name, size_t size, TTypeInfo type)
  224.     : CParent(eTypeFamilyPointer, size, name),
  225.       m_DataTypeRef(type)
  226. {
  227.     InitPointerTypeInfoFunctions();
  228. }
  229. void CPointerTypeInfo::InitPointerTypeInfoFunctions(void)
  230. {
  231.     SetCreateFunction(&CreatePointer);
  232.     SetReadFunction(&ReadPointer);
  233.     SetWriteFunction(&WritePointer);
  234.     SetCopyFunction(&CopyPointer);
  235.     SetSkipFunction(&SkipPointer);
  236.     SetFunctions(&GetPointer, &SetPointer);
  237. }
  238. void CPointerTypeInfo::SetFunctions(TGetDataFunction getFunc,
  239.                                     TSetDataFunction setFunc)
  240. {
  241.     m_GetData = getFunc;
  242.     m_SetData = setFunc;
  243. }
  244. TTypeInfo CPointerTypeInfo::GetTypeInfo(TTypeInfo base)
  245. {
  246.     return new CPointerTypeInfo(base);
  247. }
  248. bool CPointerTypeInfo::MayContainType(TTypeInfo type) const
  249. {
  250.     return GetPointedType()->IsOrMayContainType(type);
  251. }
  252. TTypeInfo CPointerTypeInfo::GetRealDataTypeInfo(TConstObjectPtr object) const
  253. {
  254.     TTypeInfo dataTypeInfo = GetPointedType();
  255.     if ( object )
  256.         dataTypeInfo = dataTypeInfo->GetRealTypeInfo(object);
  257.     return dataTypeInfo;
  258. }
  259. TObjectPtr CPointerTypeInfo::GetPointer(const CPointerTypeInfo* /*objectType*/,
  260.                                         TObjectPtr objectPtr)
  261. {
  262.     return CTypeConverter<TObjectPtr>::Get(objectPtr);
  263. }
  264. void CPointerTypeInfo::SetPointer(const CPointerTypeInfo* /*objectType*/,
  265.                                   TObjectPtr objectPtr,
  266.                                   TObjectPtr dataPtr)
  267. {
  268.     CTypeConverter<TObjectPtr>::Get(objectPtr) = dataPtr;
  269. }
  270. TObjectPtr CPointerTypeInfo::CreatePointer(TTypeInfo /*objectType*/)
  271. {
  272.     return new void*(0);
  273. }
  274. bool CPointerTypeInfo::IsDefault(TConstObjectPtr object) const
  275. {
  276.     return GetObjectPointer(object) == 0;
  277. }
  278. bool CPointerTypeInfo::Equals(TConstObjectPtr object1, TConstObjectPtr object2,
  279.                               ESerialRecursionMode how) const
  280. {
  281.     TConstObjectPtr data1 = GetObjectPointer(object1);
  282.     TConstObjectPtr data2 = GetObjectPointer(object2);
  283.     if ( how != eRecursive ) {
  284.         return how == eShallow ? (data1 == data2) : (data1 == 0 || data2 == 0);
  285.     }
  286.     else if ( data1 == 0 ) {
  287.         return data2 == 0;
  288.     }
  289.     else {
  290.         if ( data2 == 0 )
  291.             return false;
  292.         TTypeInfo type1 = GetRealDataTypeInfo(data1);
  293.         TTypeInfo type2 = GetRealDataTypeInfo(data2);
  294.         return type1 == type2 && type1->Equals(data1, data2, how);
  295.     }
  296. }
  297. void CPointerTypeInfo::SetDefault(TObjectPtr dst) const
  298. {
  299.     SetObjectPointer(dst, 0);
  300. }
  301. void CPointerTypeInfo::Assign(TObjectPtr dst, TConstObjectPtr src,
  302.                               ESerialRecursionMode how) const
  303. {
  304.     TConstObjectPtr data = GetObjectPointer(src);
  305.     if ( how != eRecursive ) {
  306.         SetObjectPointer(dst, how == eShallow ? (const_cast<void*>(data)) : 0);
  307.     }
  308.     else if ( data == 0) {
  309.         SetObjectPointer(dst, 0);
  310.     }
  311.     else {
  312.         TTypeInfo type = GetRealDataTypeInfo(data);
  313.         TObjectPtr object = type->Create();
  314.         type->Assign(object, data, how);
  315.         SetObjectPointer(dst, object);
  316.     }
  317. }
  318. void CPointerTypeInfo::ReadPointer(CObjectIStream& in,
  319.                                    TTypeInfo objectType,
  320.                                    TObjectPtr objectPtr)
  321. {
  322.     const CPointerTypeInfo* pointerType =
  323.         CTypeConverter<CPointerTypeInfo>::SafeCast(objectType);
  324.     TTypeInfo pointedType = pointerType->GetPointedType();
  325.     TObjectPtr pointedPtr = pointerType->GetObjectPointer(objectPtr);
  326.     if ( pointedPtr ) {
  327.         //pointedType->SetDefault(pointedPtr);
  328.         in.ReadObject(pointedPtr, pointedType);
  329.     }
  330.     else {
  331.         pointerType->SetObjectPointer(objectPtr,
  332.                                       in.ReadPointer(pointedType).first);
  333.     }
  334. }
  335. void CPointerTypeInfo::WritePointer(CObjectOStream& out,
  336.                                     TTypeInfo objectType,
  337.                                     TConstObjectPtr objectPtr)
  338. {
  339.     const CPointerTypeInfo* pointerType =
  340.         CTypeConverter<CPointerTypeInfo>::SafeCast(objectType);
  341.     out.WritePointer(pointerType->GetObjectPointer(objectPtr),
  342.                      pointerType->GetPointedType());
  343. }
  344. void CPointerTypeInfo::CopyPointer(CObjectStreamCopier& copier,
  345.                                    TTypeInfo objectType)
  346. {
  347.     const CPointerTypeInfo* pointerType =
  348.         CTypeConverter<CPointerTypeInfo>::SafeCast(objectType);
  349.     copier.CopyPointer(pointerType->GetPointedType());
  350. }
  351. void CPointerTypeInfo::SkipPointer(CObjectIStream& in,
  352.                                    TTypeInfo objectType)
  353. {
  354.     const CPointerTypeInfo* pointerType =
  355.         CTypeConverter<CPointerTypeInfo>::SafeCast(objectType);
  356.     in.SkipPointer(pointerType->GetPointedType());
  357. }
  358. END_NCBI_SCOPE