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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: variant.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:16:08  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef VARIANT__HPP
  10. #define VARIANT__HPP
  11. /*  $Id: variant.hpp,v 1000.1 2004/04/12 17:16:08 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/serialutil.hpp>
  43. #include <serial/item.hpp>
  44. #include <serial/hookdata.hpp>
  45. #include <serial/hookfunc.hpp>
  46. #include <serial/typeinfo.hpp>
  47. /** @addtogroup FieldsComplex
  48.  *
  49.  * @{
  50.  */
  51. BEGIN_NCBI_SCOPE
  52. class CChoiceTypeInfo;
  53. class CObjectIStream;
  54. class CObjectOStream;
  55. class CObjectStreamCopier;
  56. class CReadChoiceVariantHook;
  57. class CWriteChoiceVariantHook;
  58. class CSkipChoiceVariantHook;
  59. class CCopyChoiceVariantHook;
  60. class CDelayBuffer;
  61. class CVariantInfoFunctions;
  62. class NCBI_XSERIAL_EXPORT CVariantInfo : public CItemInfo
  63. {
  64.     typedef CItemInfo CParent;
  65. public:
  66.     typedef TConstObjectPtr (*TVariantGetConst)(const CVariantInfo*variantInfo,
  67.                                                 TConstObjectPtr choicePtr);
  68.     typedef TObjectPtr (*TVariantGet)(const CVariantInfo* variantInfo,
  69.                                       TObjectPtr choicePtr);
  70.     enum EVariantType {
  71.         ePointerFlag = 1 << 0,
  72.         eObjectFlag = 1 << 1,
  73.         eInlineVariant = 0,
  74.         eNonObjectPointerVariant = ePointerFlag,
  75.         eObjectPointerVariant = ePointerFlag | eObjectFlag,
  76.         eSubClassVariant = eObjectFlag
  77.     };
  78.     CVariantInfo(const CChoiceTypeInfo* choiceType, const CMemberId& id,
  79.                  TPointerOffsetType offset, const CTypeRef& type);
  80.     CVariantInfo(const CChoiceTypeInfo* choiceType, const CMemberId& id,
  81.                  TPointerOffsetType offset, TTypeInfo type);
  82.     CVariantInfo(const CChoiceTypeInfo* choiceType, const char* id,
  83.                  TPointerOffsetType offset, const CTypeRef& type);
  84.     CVariantInfo(const CChoiceTypeInfo* choiceType, const char* id,
  85.                  TPointerOffsetType offset, TTypeInfo type);
  86.     const CChoiceTypeInfo* GetChoiceType(void) const;
  87.     EVariantType GetVariantType(void) const;
  88.     CVariantInfo* SetNoPrefix(void);
  89.     CVariantInfo* SetNotag(void);
  90.     bool IsInline(void) const;
  91.     bool IsNonObjectPointer(void) const;
  92.     bool IsObjectPointer(void) const;
  93.     bool IsSubClass(void) const;
  94.     bool IsPointer(void) const;
  95.     bool IsNotPointer(void) const;
  96.     bool IsObject(void) const;
  97.     bool IsNotObject(void) const;
  98.     CVariantInfo* SetPointer(void);
  99.     CVariantInfo* SetObjectPointer(void);
  100.     CVariantInfo* SetSubClass(void);
  101.     bool CanBeDelayed(void) const;
  102.     CVariantInfo* SetDelayBuffer(CDelayBuffer* buffer);
  103.     CDelayBuffer& GetDelayBuffer(TObjectPtr object) const;
  104.     const CDelayBuffer& GetDelayBuffer(TConstObjectPtr object) const;
  105.     TConstObjectPtr GetVariantPtr(TConstObjectPtr choicePtr) const;
  106.     TObjectPtr GetVariantPtr(TObjectPtr choicePtr) const;
  107.     // I/O
  108.     void ReadVariant(CObjectIStream& in, TObjectPtr choicePtr) const;
  109.     void WriteVariant(CObjectOStream& out, TConstObjectPtr choicePtr) const;
  110.     void CopyVariant(CObjectStreamCopier& copier) const;
  111.     void SkipVariant(CObjectIStream& in) const;
  112.     // hooks
  113.     void SetGlobalReadHook(CReadChoiceVariantHook* hook);
  114.     void SetLocalReadHook(CObjectIStream& in,
  115.                           CReadChoiceVariantHook* hook);
  116.     void ResetGlobalReadHook(void);
  117.     void ResetLocalReadHook(CObjectIStream& in);
  118.     void SetPathReadHook(CObjectIStream* in, const string& path,
  119.                          CReadChoiceVariantHook* hook);
  120.     void SetGlobalWriteHook(CWriteChoiceVariantHook* hook);
  121.     void SetLocalWriteHook(CObjectOStream& out,
  122.                            CWriteChoiceVariantHook* hook);
  123.     void ResetGlobalWriteHook(void);
  124.     void ResetLocalWriteHook(CObjectOStream& out);
  125.     void SetPathWriteHook(CObjectOStream* out, const string& path,
  126.                           CWriteChoiceVariantHook* hook);
  127.     void SetGlobalSkipHook(CSkipChoiceVariantHook* hook);
  128.     void SetLocalSkipHook(CObjectIStream& in, CSkipChoiceVariantHook* hook);
  129.     void ResetGlobalSkipHook(void);
  130.     void ResetLocalSkipHook(CObjectIStream& in);
  131.     void SetPathSkipHook(CObjectIStream* in, const string& path,
  132.                          CSkipChoiceVariantHook* hook);
  133.     void SetGlobalCopyHook(CCopyChoiceVariantHook* hook);
  134.     void SetLocalCopyHook(CObjectStreamCopier& copier,
  135.                           CCopyChoiceVariantHook* hook);
  136.     void ResetGlobalCopyHook(void);
  137.     void ResetLocalCopyHook(CObjectStreamCopier& copier);
  138.     void SetPathCopyHook(CObjectStreamCopier* copier, const string& path,
  139.                          CCopyChoiceVariantHook* hook);
  140.     // default I/O (without hooks)
  141.     void DefaultReadVariant(CObjectIStream& in,
  142.                             TObjectPtr choicePtr) const;
  143.     void DefaultWriteVariant(CObjectOStream& out,
  144.                              TConstObjectPtr choicePtr) const;
  145.     void DefaultCopyVariant(CObjectStreamCopier& copier) const;
  146.     void DefaultSkipVariant(CObjectIStream& in) const;
  147.     
  148.     virtual void UpdateDelayedBuffer(CObjectIStream& in,
  149.                                      TObjectPtr classPtr) const;
  150. private:
  151.     // Create choice object
  152.     TObjectPtr CreateChoice(void) const;
  153.     // owning choice type info
  154.     const CChoiceTypeInfo* m_ChoiceType;
  155.     // type of variant implementation: inline, pointer etc.
  156.     EVariantType m_VariantType;
  157.     // offset of delay buffer inside object
  158.     TPointerOffsetType m_DelayOffset;
  159.     TVariantGetConst m_GetConstFunction;
  160.     TVariantGet m_GetFunction;
  161.     CHookData<CReadChoiceVariantHook, TVariantReadFunction> m_ReadHookData;
  162.     CHookData<CWriteChoiceVariantHook, TVariantWriteFunction> m_WriteHookData;
  163.     CHookData<CSkipChoiceVariantHook, TVariantSkipFunction> m_SkipHookData;
  164.     CHookData<CCopyChoiceVariantHook, TVariantCopyFunction> m_CopyHookData;
  165.     void SetReadFunction(TVariantReadFunction func);
  166.     void SetWriteFunction(TVariantWriteFunction func);
  167.     void SetCopyFunction(TVariantCopyFunction func);
  168.     void SetSkipFunction(TVariantSkipFunction func);
  169.     void UpdateFunctions(void);
  170.     friend class CVariantInfoFunctions;
  171. };
  172. /* @} */
  173. #include <serial/variant.inl>
  174. END_NCBI_SCOPE
  175. #endif  /* VARIANT__HPP */
  176. /* ---------------------------------------------------------------------------
  177. * $Log: variant.hpp,v $
  178. * Revision 1000.1  2004/04/12 17:16:08  gouriano
  179. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.12
  180. *
  181. * Revision 1.12  2004/01/05 14:24:10  gouriano
  182. * Added possibility to set serialization hooks by stack path
  183. *
  184. * Revision 1.11  2003/07/29 18:47:47  vasilche
  185. * Fixed thread safeness of object stream hooks.
  186. *
  187. * Revision 1.10  2003/04/15 16:19:15  siyan
  188. * Added doxygen support
  189. *
  190. * Revision 1.9  2002/12/23 18:38:52  dicuccio
  191. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  192. * Moved all CVS logs to the end.
  193. *
  194. * Revision 1.8  2002/11/19 19:45:55  gouriano
  195. * added SetNotag method
  196. *
  197. * Revision 1.7  2002/10/15 13:39:06  gouriano
  198. * added "noprefix" flag
  199. *
  200. * Revision 1.6  2002/09/09 18:14:00  grichenk
  201. * Added CObjectHookGuard class.
  202. * Added methods to be used by hooks for data
  203. * reading and skipping.
  204. *
  205. * Revision 1.5  2000/10/13 20:22:47  vasilche
  206. * Fixed warnings on 64 bit compilers.
  207. * Fixed missing typename in templates.
  208. *
  209. * Revision 1.4  2000/10/03 17:22:36  vasilche
  210. * Reduced header dependency.
  211. * Reduced size of debug libraries on WorkShop by 3 times.
  212. * Fixed tag allocation for parent classes.
  213. * Fixed CObject allocation/deallocation in streams.
  214. * Moved instantiation of several templates in separate source file.
  215. *
  216. * Revision 1.3  2000/09/29 16:18:15  vasilche
  217. * Fixed binary format encoding/decoding on 64 bit compulers.
  218. * Implemented CWeakMap<> for automatic cleaning map entries.
  219. * Added cleaning local hooks via CWeakMap<>.
  220. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  221. * Added some user interface methods to CObjectIStream, CObjectOStream and
  222. * CObjectStreamCopier.
  223. *
  224. * Revision 1.2  2000/09/26 17:38:08  vasilche
  225. * Fixed incomplete choiceptr implementation.
  226. * Removed temporary comments.
  227. *
  228. * Revision 1.1  2000/09/18 20:00:12  vasilche
  229. * Separated CVariantInfo and CMemberInfo.
  230. * Implemented copy hooks.
  231. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  232. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  233. *
  234. * ===========================================================================
  235. */