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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: continfo.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:40:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: continfo.cpp,v 1000.2 2004/06/01 19:40:02 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: continfo.cpp,v $
  41. * Revision 1000.2  2004/06/01 19:40:02  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  43. *
  44. * Revision 1.12  2004/05/19 17:27:52  gouriano
  45. * Reset the contents of container when assigning
  46. *
  47. * Revision 1.11  2004/05/17 21:03:02  gorelenk
  48. * Added include of PCH ncbi_pch.hpp
  49. *
  50. * Revision 1.10  2004/03/25 15:57:08  gouriano
  51. * Added possibility to copy and compare serial object non-recursively
  52. *
  53. * Revision 1.9  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.8  2003/03/10 18:54:25  gouriano
  58. * use new structured exceptions (based on CException)
  59. *
  60. * Revision 1.7  2002/10/08 18:59:38  grichenk
  61. * Check for null pointers in containers (assert in debug mode,
  62. * warning in release).
  63. *
  64. * Revision 1.6  2000/10/17 18:45:33  vasilche
  65. * Added possibility to turn off object cross reference detection in
  66. * CObjectIStream and CObjectOStream.
  67. *
  68. * Revision 1.5  2000/10/13 16:28:39  vasilche
  69. * Reduced header dependency.
  70. * Avoid use of templates with virtual methods.
  71. * Reduced amount of different maps used.
  72. * All this lead to smaller compiled code size (libraries and programs).
  73. *
  74. * Revision 1.4  2000/09/18 20:00:21  vasilche
  75. * Separated CVariantInfo and CMemberInfo.
  76. * Implemented copy hooks.
  77. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  78. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  79. *
  80. * Revision 1.3  2000/09/13 15:10:15  vasilche
  81. * Fixed type detection in type iterators.
  82. *
  83. * Revision 1.2  2000/09/01 13:16:15  vasilche
  84. * Implemented class/container/choice iterators.
  85. * Implemented CObjectStreamCopier for copying data without loading into memory.
  86. *
  87. * Revision 1.1  2000/07/03 18:42:43  vasilche
  88. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  89. * Reduced header dependency.
  90. *
  91. * ===========================================================================
  92. */
  93. #include <ncbi_pch.hpp>
  94. #include <corelib/ncbistd.hpp>
  95. #include <corelib/ncbiutil.hpp>
  96. #include <serial/continfo.hpp>
  97. #include <serial/objistr.hpp>
  98. #include <serial/objostr.hpp>
  99. #include <serial/objcopy.hpp>
  100. #include <serial/serialutil.hpp>
  101. BEGIN_NCBI_SCOPE
  102. CContainerTypeInfo::CContainerTypeInfo(size_t size,
  103.                                        TTypeInfo elementType,
  104.                                        bool randomOrder)
  105.     : CParent(eTypeFamilyContainer, size),
  106.       m_ElementType(elementType), m_RandomOrder(randomOrder)
  107. {
  108.     InitContainerTypeInfoFunctions();
  109. }
  110. CContainerTypeInfo::CContainerTypeInfo(size_t size,
  111.                                        const CTypeRef& elementType,
  112.                                        bool randomOrder)
  113.     : CParent(eTypeFamilyContainer, size),
  114.       m_ElementType(elementType), m_RandomOrder(randomOrder)
  115. {
  116.     InitContainerTypeInfoFunctions();
  117. }
  118. CContainerTypeInfo::CContainerTypeInfo(size_t size, const char* name,
  119.                                        TTypeInfo elementType,
  120.                                        bool randomOrder)
  121.     : CParent(eTypeFamilyContainer, size, name),
  122.       m_ElementType(elementType), m_RandomOrder(randomOrder)
  123. {
  124.     InitContainerTypeInfoFunctions();
  125. }
  126. CContainerTypeInfo::CContainerTypeInfo(size_t size, const char* name,
  127.                                        const CTypeRef& elementType,
  128.                                        bool randomOrder)
  129.     : CParent(eTypeFamilyContainer, size, name),
  130.       m_ElementType(elementType), m_RandomOrder(randomOrder)
  131. {
  132.     InitContainerTypeInfoFunctions();
  133. }
  134. CContainerTypeInfo::CContainerTypeInfo(size_t size, const string& name,
  135.                                        TTypeInfo elementType,
  136.                                        bool randomOrder)
  137.     : CParent(eTypeFamilyContainer, size, name),
  138.       m_ElementType(elementType), m_RandomOrder(randomOrder)
  139. {
  140.     InitContainerTypeInfoFunctions();
  141. }
  142. CContainerTypeInfo::CContainerTypeInfo(size_t size, const string& name,
  143.                                        const CTypeRef& elementType,
  144.                                        bool randomOrder)
  145.     : CParent(eTypeFamilyContainer, size, name),
  146.       m_ElementType(elementType), m_RandomOrder(randomOrder)
  147. {
  148.     InitContainerTypeInfoFunctions();
  149. }
  150. class CContainerTypeInfoFunctions
  151. {
  152. public:
  153.     static void Throw(const char* message)
  154.         {
  155.             NCBI_THROW(CSerialException,eFail, message);
  156.         }
  157.     static bool InitIteratorConst(CContainerTypeInfo::CConstIterator&)
  158.         {
  159.             Throw("cannot create iterator");
  160.             return false;
  161.         }
  162.     static bool InitIterator(CContainerTypeInfo::CIterator&)
  163.         {
  164.             Throw("cannot create iterator");
  165.             return false;
  166.         }
  167.     static void AddElement(const CContainerTypeInfo* /*containerType*/,
  168.                            TObjectPtr /*containerPtr*/,
  169.                            TConstObjectPtr /*elementPtr*/,
  170.                            ESerialRecursionMode)
  171.         {
  172.             Throw("illegal call");
  173.         }
  174.     
  175.     static void AddElementIn(const CContainerTypeInfo* /*containerType*/,
  176.                              TObjectPtr /*containerPtr*/,
  177.                              CObjectIStream& /*in*/)
  178.         {
  179.             Throw("illegal call");
  180.         }
  181. };
  182. void CContainerTypeInfo::InitContainerTypeInfoFunctions(void)
  183. {
  184.     SetReadFunction(&ReadContainer);
  185.     SetWriteFunction(&WriteContainer);
  186.     SetCopyFunction(&CopyContainer);
  187.     SetSkipFunction(&SkipContainer);
  188.     m_InitIteratorConst = &CContainerTypeInfoFunctions::InitIteratorConst;
  189.     m_InitIterator = &CContainerTypeInfoFunctions::InitIterator;
  190.     m_AddElement = &CContainerTypeInfoFunctions::AddElement;
  191.     m_AddElementIn = &CContainerTypeInfoFunctions::AddElementIn;
  192. }
  193. void CContainerTypeInfo::SetAddElementFunctions(TAddElement addElement,
  194.                                                 TAddElementIn addElementIn)
  195. {
  196.     m_AddElement = addElement;
  197.     m_AddElementIn = addElementIn;
  198. }
  199. void CContainerTypeInfo::SetConstIteratorFunctions(TInitIteratorConst init,
  200.                                                    TReleaseIteratorConst release,
  201.                                                    TCopyIteratorConst copy,
  202.                                                    TNextElementConst next,
  203.                                                    TGetElementPtrConst get)
  204. {
  205.     m_InitIteratorConst = init;
  206.     m_ReleaseIteratorConst = release;
  207.     m_CopyIteratorConst = copy;
  208.     m_NextElementConst = next;
  209.     m_GetElementPtrConst = get;
  210. }
  211. void CContainerTypeInfo::SetIteratorFunctions(TInitIterator init,
  212.                                               TReleaseIterator release,
  213.                                               TCopyIterator copy,
  214.                                               TNextElement next,
  215.                                               TGetElementPtr get,
  216.                                               TEraseElement erase,
  217.                                               TEraseAllElements erase_all)
  218. {
  219.     m_InitIterator = init;
  220.     m_ReleaseIterator = release;
  221.     m_CopyIterator = copy;
  222.     m_NextElement = next;
  223.     m_GetElementPtr = get;
  224.     m_EraseElement = erase;
  225.     m_EraseAllElements = erase_all;
  226. }
  227. bool CContainerTypeInfo::MayContainType(TTypeInfo type) const
  228. {
  229.     return GetElementType()->IsOrMayContainType(type);
  230. }
  231. void CContainerTypeInfo::Assign(TObjectPtr dst, TConstObjectPtr src,
  232.                                 ESerialRecursionMode how) const
  233. {
  234.     //SetDefault(dst); // clear destination container
  235.     if (how == eShallowChildless) {
  236.         return;
  237.     }
  238.     CIterator idst;
  239.     CConstIterator isrc;
  240.     bool old_element = InitIterator(idst,dst);
  241.     if ( InitIterator(isrc, src) ) {
  242.         do {
  243.             if (GetElementType()->GetTypeFamily() == eTypeFamilyPointer) {
  244.                 const CPointerTypeInfo* pointerType =
  245.                     CTypeConverter<CPointerTypeInfo>::SafeCast(GetElementType());
  246.                 _ASSERT(pointerType->GetObjectPointer(GetElementPtr(isrc)));
  247.                 if ( !pointerType->GetObjectPointer(GetElementPtr(isrc)) ) {
  248.                     ERR_POST(Warning << " NULL pointer found in container: skipping");
  249.                     continue;
  250.                 }
  251.             }
  252.             if (old_element) {
  253.                 GetElementType()->Assign(GetElementPtr(idst), GetElementPtr(isrc), how);
  254.                 old_element = NextElement(idst);
  255.             } else {
  256.                 AddElement(dst, GetElementPtr(isrc), how);
  257.             }
  258.         } while ( NextElement(isrc) );
  259.     }
  260.     if (old_element) {
  261.         EraseAllElements(idst);
  262.     }
  263. }
  264. bool CContainerTypeInfo::Equals(TConstObjectPtr object1, TConstObjectPtr object2,
  265.                                 ESerialRecursionMode how) const
  266. {
  267.     if (how == eShallowChildless) {
  268.         return true;
  269.     }
  270.     TTypeInfo elementType = GetElementType();
  271.     CConstIterator i1, i2;
  272.     if ( InitIterator(i1, object1) ) {
  273.         if ( !InitIterator(i2, object2) )
  274.             return false;
  275.         if ( !elementType->Equals(GetElementPtr(i1),
  276.                                   GetElementPtr(i2), how) )
  277.             return false;
  278.         while ( NextElement(i1) ) {
  279.             if ( !NextElement(i2) )
  280.                 return false;
  281.             if ( !elementType->Equals(GetElementPtr(i1),
  282.                                       GetElementPtr(i2), how) )
  283.                 return false;
  284.         }
  285.         return !NextElement(i2);
  286.     }
  287.     else {
  288.         return !InitIterator(i2, object2);
  289.     }
  290. }
  291. void CContainerTypeInfo::ReadContainer(CObjectIStream& in,
  292.                                        TTypeInfo objectType,
  293.                                        TObjectPtr objectPtr)
  294. {
  295.     const CContainerTypeInfo* containerType =
  296.         CTypeConverter<CContainerTypeInfo>::SafeCast(objectType);
  297.     in.ReadContainer(containerType, objectPtr);
  298. }
  299. void CContainerTypeInfo::WriteContainer(CObjectOStream& out,
  300.                                         TTypeInfo objectType,
  301.                                         TConstObjectPtr objectPtr)
  302. {
  303.     const CContainerTypeInfo* containerType =
  304.         CTypeConverter<CContainerTypeInfo>::SafeCast(objectType);
  305.     out.WriteContainer(containerType, objectPtr);
  306. }
  307. void CContainerTypeInfo::CopyContainer(CObjectStreamCopier& copier,
  308.                                        TTypeInfo objectType)
  309. {
  310.     const CContainerTypeInfo* containerType =
  311.         CTypeConverter<CContainerTypeInfo>::SafeCast(objectType);
  312.     copier.CopyContainer(containerType);
  313. }
  314. void CContainerTypeInfo::SkipContainer(CObjectIStream& in,
  315.                                        TTypeInfo objectType)
  316. {
  317.     const CContainerTypeInfo* containerType =
  318.         CTypeConverter<CContainerTypeInfo>::SafeCast(objectType);
  319.     in.SkipContainer(containerType);
  320. }
  321. END_NCBI_SCOPE