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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objectio.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:25:12  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTIO__HPP
  10. #define OBJECTIO__HPP
  11. /*  $Id: objectio.hpp,v 1000.0 2003/10/29 17:25:12 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/objectinfo.hpp>
  43. #include <serial/objectiter.hpp>
  44. /** @addtogroup UserCodeSupport
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. class NCBI_XSERIAL_EXPORT COStreamFrame
  50. {
  51. public:
  52.     COStreamFrame(CObjectOStream& stream);
  53.     ~COStreamFrame(void);
  54.     CObjectOStream& GetStream(void) const;
  55.     bool Good(void) const;
  56. private:
  57.     CObjectOStream& m_Stream;
  58.     size_t m_Depth;
  59.     void* operator new(size_t size);
  60.     void* operator new[](size_t size);
  61.     //void operator delete(void* ptr);
  62.     //void operator delete[](void* ptr);
  63. };
  64. class NCBI_XSERIAL_EXPORT CIStreamFrame
  65. {
  66. public:
  67.     CIStreamFrame(CObjectIStream& stream);
  68.     ~CIStreamFrame(void);
  69.     CObjectIStream& GetStream(void) const;
  70.     bool Good(void) const;
  71. private:
  72.     CObjectIStream& m_Stream;
  73.     size_t m_Depth;
  74.     void* operator new(size_t size);
  75.     void* operator new[](size_t size);
  76.     //void operator delete(void* ptr);
  77.     //void operator delete[](void* ptr);
  78. };
  79. /*************************
  80. //class for writing class members
  81. //   suggested use:
  82.     CObjectOStream& out;
  83.     CObjectTypeInfo::CMemberIterator member;
  84.     { // block for automatic call of COStreamClassMember destructor
  85.         COStreamClassMember o(out, member);
  86.         ... // write member object
  87.     } // here COStreamClassMember destructor will be called
  88. **************************/
  89. class NCBI_XSERIAL_EXPORT COStreamClassMember : public COStreamFrame
  90. {
  91.     typedef COStreamFrame CParent;
  92. public:
  93.     COStreamClassMember(CObjectOStream& out,
  94.                         const CObjectTypeInfo::CMemberIterator& member);
  95.     ~COStreamClassMember(void);
  96. };
  97. /*************************
  98. // class for reading (iterating through)
  99. // members of the class (SET, SEQUENCE)
  100. //   suggested use:
  101.    CObjectIStream& in;
  102.    CObjectTypeInfo classMemberType;
  103.    for ( CIStreamClassMemberIterator i(in, classMemberType); i; ++i ) {
  104.        CElementClass element;
  105.        i >> element;
  106.    }
  107. **************************/
  108. class NCBI_XSERIAL_EXPORT CIStreamClassMemberIterator : public CIStreamFrame
  109. {
  110.     typedef CIStreamFrame CParent;
  111. public:
  112.     CIStreamClassMemberIterator(CObjectIStream& in,
  113.                                 const CObjectTypeInfo& classMemberType);
  114.     ~CIStreamClassMemberIterator(void);
  115.     bool HaveMore(void) const;
  116.     operator bool(void) const;
  117.     void NextClassMember(void);
  118.     CIStreamClassMemberIterator& operator++(void);
  119.     void ReadClassMember(const CObjectInfo& classMember);
  120.     void SkipClassMember(const CObjectTypeInfo& classMemberType);
  121.     void SkipClassMember(void);
  122.     CObjectTypeInfoMI operator*(void) const;
  123. private:
  124.     void BeginClassMember(void);
  125.     void IllegalCall(const char* message) const;
  126.     void BadState(void) const;
  127.     void CheckState(void);
  128.     const CMemberInfo* GetMemberInfo(void) const;
  129.     CObjectTypeInfo m_ClassType;
  130.     TMemberIndex m_MemberIndex;
  131. };
  132. /*************************
  133. // class for reading (iterating through)
  134. // elements of containers (SET OF, SEQUENCE OF).
  135. //   suggested use:
  136.    CObjectIStream& in;
  137.    CObjectTypeInfo containerType;
  138.    for ( CIStreamContainerIterator i(in, containerType); i; ++i ) {
  139.        CElementClass element;
  140.        i >> element;
  141.    }
  142. **************************/
  143. class NCBI_XSERIAL_EXPORT CIStreamContainerIterator : public CIStreamFrame
  144. {
  145.     typedef CIStreamFrame CParent;
  146. public:
  147.     CIStreamContainerIterator(CObjectIStream& in,
  148.                               const CObjectTypeInfo& containerType);
  149.     ~CIStreamContainerIterator(void);
  150.     const CObjectTypeInfo& GetContainerType(void) const;
  151.     bool HaveMore(void) const;
  152.     operator bool(void) const;
  153.     void NextElement(void);
  154.     CIStreamContainerIterator& operator++(void);
  155.     void ReadElement(const CObjectInfo& element);
  156.     void SkipElement(const CObjectTypeInfo& elementType);
  157.     void SkipElement(void);
  158. private:
  159.     const CContainerTypeInfo* GetContainerTypeInfo(void) const;
  160.     void BeginElement(void);
  161.     void BeginElementData(void);
  162.     void BeginElementData(const CObjectTypeInfo& elementType);
  163.     void IllegalCall(const char* message) const;
  164.     void BadState(void) const;
  165.     enum EState {
  166.         eElementBegin,
  167.         eElementEnd,
  168.         eNoMoreElements,
  169.         eFinished,
  170.         eError // exception was thrown
  171.     };
  172.     void CheckState(EState state);
  173.     CObjectTypeInfo m_ContainerType;
  174.     TTypeInfo m_ElementTypeInfo;
  175.     EState m_State;
  176. };
  177. template<typename T>
  178. inline
  179. void operator>>(CIStreamContainerIterator& i, T& element)
  180. {
  181.     i.ReadElement(ObjectInfo(element));
  182. }
  183. /*************************
  184. //class for writing containers (SET OF, SEQUENCE OF).
  185. //   suggested use:
  186.     CObjectOStream& out;
  187.     CObjectTypeInfo containerType;
  188.     set<CElementClass> container;
  189.     { // block for automatic call of COStreamContainer destructor
  190.         COStreamContainer o(out, containerType);
  191.         for ( set<CElementClass>::const_iterator i = container.begin();
  192.               i != container.end(); ++i ) {
  193.             const CElementClass& element = *i;
  194.             o << element;
  195.         }
  196.     } // here COStreamContainer destructor will be called
  197. **************************/
  198. class NCBI_XSERIAL_EXPORT COStreamContainer : public COStreamFrame
  199. {
  200.     typedef COStreamFrame CParent;
  201. public:
  202.     COStreamContainer(CObjectOStream& out,
  203.                       const CObjectTypeInfo& containerType);
  204.     ~COStreamContainer(void);
  205.     const CObjectTypeInfo& GetContainerType(void) const;
  206.     void WriteElement(const CConstObjectInfo& element);
  207. private:
  208.     const CContainerTypeInfo* GetContainerTypeInfo(void) const;
  209.     CObjectTypeInfo m_ContainerType;
  210.     TTypeInfo m_ElementTypeInfo;
  211. };
  212. template<typename T>
  213. inline
  214. void operator<<(COStreamContainer& o, const T& element)
  215. {
  216.     o.WriteElement(ConstObjectInfo(element));
  217. }
  218. /* @} */
  219. #include <serial/objectio.inl>
  220. END_NCBI_SCOPE
  221. #endif  /* OBJECTIO__HPP */
  222. /* ---------------------------------------------------------------------------
  223. * $Log: objectio.hpp,v $
  224. * Revision 1000.0  2003/10/29 17:25:12  gouriano
  225. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.7
  226. *
  227. * Revision 1.7  2003/10/24 15:54:27  grichenk
  228. * Removed or blocked exceptions in destructors
  229. *
  230. * Revision 1.6  2003/04/15 16:18:13  siyan
  231. * Added doxygen support
  232. *
  233. * Revision 1.5  2002/12/23 18:38:51  dicuccio
  234. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  235. * Moved all CVS logs to the end.
  236. *
  237. * Revision 1.4  2001/05/17 14:57:32  lavr
  238. * Typos corrected
  239. *
  240. * Revision 1.3  2001/01/22 23:23:57  vakatov
  241. * Added   CIStreamClassMemberIterator
  242. * Renamed CIStreamContainer --> CIStreamContainerIterator
  243. *
  244. * Revision 1.2  2000/10/20 19:29:15  vasilche
  245. * Adapted for MSVC which doesn't like explicit operator templates.
  246. *
  247. * Revision 1.1  2000/10/20 15:51:25  vasilche
  248. * Fixed data error processing.
  249. * Added interface for constructing container objects directly into output stream.
  250. * object.hpp, object.inl and object.cpp were split to
  251. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  252. *
  253. * ===========================================================================
  254. */