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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: continfo.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:14:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONTINFO__HPP
  10. #define CONTINFO__HPP
  11. /*  $Id: continfo.hpp,v 1000.1 2004/04/12 17:14:31 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 <corelib/ncbiutil.hpp>
  43. #include <serial/typeinfo.hpp>
  44. #include <serial/typeref.hpp>
  45. #include <memory>
  46. /** @addtogroup TypeInfoCPP
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. class CConstContainerElementIterator;
  52. class CContainerElementIterator;
  53. class NCBI_XSERIAL_EXPORT CContainerTypeInfo : public CTypeInfo
  54. {
  55.     typedef CTypeInfo CParent;
  56. public:
  57.     CContainerTypeInfo(size_t size,
  58.                        TTypeInfo elementType, bool randomOrder);
  59.     CContainerTypeInfo(size_t size,
  60.                        const CTypeRef& elementType, bool randomOrder);
  61.     CContainerTypeInfo(size_t size, const char* name,
  62.                        TTypeInfo elementType, bool randomOrder);
  63.     CContainerTypeInfo(size_t size, const char* name,
  64.                        const CTypeRef& elementType, bool randomOrder);
  65.     CContainerTypeInfo(size_t size, const string& name,
  66.                        TTypeInfo elementType, bool randomOrder);
  67.     CContainerTypeInfo(size_t size, const string& name,
  68.                        const CTypeRef& elementType, bool randomOrder);
  69.     TTypeInfo GetElementType(void) const;
  70.     bool RandomElementsOrder(void) const;
  71.     
  72.     virtual bool MayContainType(TTypeInfo type) const;
  73.     void Assign(TObjectPtr dst, TConstObjectPtr src,
  74.                 ESerialRecursionMode how = eRecursive) const;
  75.     bool Equals(TConstObjectPtr object1, TConstObjectPtr object2,
  76.                 ESerialRecursionMode how = eRecursive) const;
  77.     // iterators methods (private)
  78.     class CConstIterator
  79.     {
  80.     public:
  81.         CConstIterator(void);
  82.         ~CConstIterator(void);
  83.         typedef NCBI_NS_NCBI::TConstObjectPtr TObjectPtr;
  84.         const CContainerTypeInfo* GetContainerType(void) const;
  85.         TObjectPtr GetContainerPtr(void) const;
  86.         void Reset(void);
  87.         const CContainerTypeInfo* m_ContainerType;
  88.         TObjectPtr                m_ContainerPtr;
  89.         void*                     m_IteratorData;
  90.     };
  91.     
  92.     class CIterator
  93.     {
  94.     public:
  95.         CIterator(void);
  96.         ~CIterator(void);
  97.         typedef NCBI_NS_NCBI::TObjectPtr TObjectPtr;
  98.         const CContainerTypeInfo* GetContainerType(void) const;
  99.         TObjectPtr GetContainerPtr(void) const;
  100.         void Reset(void);
  101.         const CContainerTypeInfo* m_ContainerType;
  102.         TObjectPtr                m_ContainerPtr;
  103.         void*                     m_IteratorData;
  104.     };
  105.     bool InitIterator(CConstIterator& it, TConstObjectPtr containerPtr) const;
  106.     void ReleaseIterator(CConstIterator& it) const;
  107.     void CopyIterator(CConstIterator& dst, const CConstIterator& src) const;
  108.     bool NextElement(CConstIterator& it) const;
  109.     TConstObjectPtr GetElementPtr(const CConstIterator& it) const;
  110.     bool InitIterator(CIterator& it, TObjectPtr containerPtr) const;
  111.     void ReleaseIterator(CIterator& it) const;
  112.     void CopyIterator(CIterator& dst, const CIterator& src) const;
  113.     bool NextElement(CIterator& it) const;
  114.     TObjectPtr GetElementPtr(const CIterator& it) const;
  115.     bool EraseElement(CIterator& it) const;
  116.     void EraseAllElements(CIterator& it) const;
  117.     void AddElement(TObjectPtr containerPtr, TConstObjectPtr elementPtr,
  118.                     ESerialRecursionMode how = eRecursive) const;
  119.     void AddElement(TObjectPtr containerPtr, CObjectIStream& in) const;
  120.     typedef bool (*TInitIteratorConst)(CConstIterator&);
  121.     typedef void (*TReleaseIteratorConst)(CConstIterator&);
  122.     typedef void (*TCopyIteratorConst)(CConstIterator&, const CConstIterator&);
  123.     typedef bool (*TNextElementConst)(CConstIterator&);
  124.     typedef TConstObjectPtr (*TGetElementPtrConst)(const CConstIterator&);
  125.     typedef bool (*TInitIterator)(CIterator&);
  126.     typedef void (*TReleaseIterator)(CIterator&);
  127.     typedef void (*TCopyIterator)(CIterator&, const CIterator&);
  128.     typedef bool (*TNextElement)(CIterator&);
  129.     typedef TObjectPtr (*TGetElementPtr)(const CIterator&);
  130.     typedef bool (*TEraseElement)(CIterator&);
  131.     typedef void (*TEraseAllElements)(CIterator&);
  132.     typedef void (*TAddElement)(const CContainerTypeInfo* cType,
  133.                                 TObjectPtr cPtr, TConstObjectPtr ePtr,
  134.                                 ESerialRecursionMode how);
  135.     typedef void (*TAddElementIn)(const CContainerTypeInfo* cType,
  136.                                   TObjectPtr cPtr, CObjectIStream& in);
  137.     void SetConstIteratorFunctions(TInitIteratorConst, TReleaseIteratorConst,
  138.                                    TCopyIteratorConst, TNextElementConst,
  139.                                    TGetElementPtrConst);
  140.     void SetIteratorFunctions(TInitIterator, TReleaseIterator,
  141.                               TCopyIterator, TNextElement,
  142.                               TGetElementPtr,
  143.                               TEraseElement, TEraseAllElements);
  144.     void SetAddElementFunctions(TAddElement, TAddElementIn);
  145. protected:
  146.     static void ReadContainer(CObjectIStream& in,
  147.                               TTypeInfo objectType,
  148.                               TObjectPtr objectPtr);
  149.     static void WriteContainer(CObjectOStream& out,
  150.                                TTypeInfo objectType,
  151.                                TConstObjectPtr objectPtr);
  152.     static void SkipContainer(CObjectIStream& in,
  153.                               TTypeInfo objectType);
  154.     static void CopyContainer(CObjectStreamCopier& copier,
  155.                               TTypeInfo objectType);
  156. protected:
  157.     CTypeRef m_ElementType;
  158.     bool m_RandomOrder;
  159. private:
  160.     void InitContainerTypeInfoFunctions(void);
  161.     // iterator functions
  162.     TInitIteratorConst m_InitIteratorConst;
  163.     TReleaseIteratorConst m_ReleaseIteratorConst;
  164.     TCopyIteratorConst m_CopyIteratorConst;
  165.     TNextElementConst m_NextElementConst;
  166.     TGetElementPtrConst m_GetElementPtrConst;
  167.     TInitIterator m_InitIterator;
  168.     TReleaseIterator m_ReleaseIterator;
  169.     TCopyIterator m_CopyIterator;
  170.     TNextElement m_NextElement;
  171.     TGetElementPtr m_GetElementPtr;
  172.     TEraseElement m_EraseElement;
  173.     TEraseAllElements m_EraseAllElements;
  174.     TAddElement m_AddElement;
  175.     TAddElementIn m_AddElementIn;
  176. };
  177. class NCBI_XSERIAL_EXPORT CConstContainerElementIterator
  178. {
  179. public:
  180.     typedef CContainerTypeInfo::CConstIterator TIterator;
  181.     CConstContainerElementIterator(void);
  182.     CConstContainerElementIterator(TConstObjectPtr containerPtr,
  183.                                    const CContainerTypeInfo* containerType);
  184.     CConstContainerElementIterator(const CConstContainerElementIterator& src);
  185.     CConstContainerElementIterator&
  186.     operator=(const CConstContainerElementIterator& src);
  187.     
  188.     void Init(TConstObjectPtr containerPtr,
  189.               const CContainerTypeInfo* containerType);
  190.     TTypeInfo GetElementType(void) const;
  191.     
  192.     bool Valid(void) const;
  193.     void Next(void);
  194.     pair<TConstObjectPtr, TTypeInfo> Get(void) const;
  195. private:
  196.     TTypeInfo m_ElementType;
  197.     TIterator m_Iterator;
  198.     bool m_Valid;
  199. };
  200. class NCBI_XSERIAL_EXPORT CContainerElementIterator
  201. {
  202. public:
  203.     typedef CContainerTypeInfo::CIterator TIterator;
  204.     CContainerElementIterator(void);
  205.     CContainerElementIterator(TObjectPtr containerPtr,
  206.                               const CContainerTypeInfo* containerType);
  207.     CContainerElementIterator(const CContainerElementIterator& src);
  208.     CContainerElementIterator& operator=(const CContainerElementIterator& src);
  209.     void Init(TObjectPtr containerPtr,
  210.               const CContainerTypeInfo* containerType);
  211.     TTypeInfo GetElementType(void) const;
  212.     
  213.     bool Valid(void) const;
  214.     void Next(void);
  215.     void Erase(void);
  216.     void EraseAll(void);
  217.     pair<TObjectPtr, TTypeInfo> Get(void) const;
  218. private:
  219.     TTypeInfo m_ElementType;
  220.     TIterator m_Iterator;
  221.     bool m_Valid;
  222. };
  223. /* @} */
  224. #include <serial/continfo.inl>
  225. END_NCBI_SCOPE
  226. #endif  /* CONTINFO__HPP */
  227. /* ---------------------------------------------------------------------------
  228. * $Log: continfo.hpp,v $
  229. * Revision 1000.1  2004/04/12 17:14:31  gouriano
  230. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.10
  231. *
  232. * Revision 1.10  2004/03/25 15:56:27  gouriano
  233. * Added possibility to copy and compare serial object non-recursively
  234. *
  235. * Revision 1.9  2003/08/14 20:03:57  vasilche
  236. * Avoid memory reallocation when reading over preallocated object.
  237. * Simplified CContainerTypeInfo iterators interface.
  238. *
  239. * Revision 1.8  2003/04/15 14:15:06  siyan
  240. * Added doxygen support
  241. *
  242. * Revision 1.7  2002/12/23 18:38:50  dicuccio
  243. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  244. * Moved all CVS logs to the end.
  245. *
  246. * Revision 1.6  2000/10/13 16:28:30  vasilche
  247. * Reduced header dependency.
  248. * Avoid use of templates with virtual methods.
  249. * Reduced amount of different maps used.
  250. * All this lead to smaller compiled code size (libraries and programs).
  251. *
  252. * Revision 1.5  2000/09/18 20:00:00  vasilche
  253. * Separated CVariantInfo and CMemberInfo.
  254. * Implemented copy hooks.
  255. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  256. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  257. *
  258. * Revision 1.4  2000/09/13 15:10:13  vasilche
  259. * Fixed type detection in type iterators.
  260. *
  261. * Revision 1.3  2000/09/01 13:15:58  vasilche
  262. * Implemented class/container/choice iterators.
  263. * Implemented CObjectStreamCopier for copying data without loading into memory.
  264. *
  265. * Revision 1.2  2000/08/15 19:44:38  vasilche
  266. * Added Read/Write hooks:
  267. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  268. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  269. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  270. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  271. *
  272. * Revision 1.1  2000/07/03 18:42:33  vasilche
  273. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  274. * Reduced header dependency.
  275. *
  276. * ===========================================================================
  277. */