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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: stdtypesimpl.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:31:26  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef STDTYPESIMPL__HPP
  10. #define STDTYPESIMPL__HPP
  11. /*  $Id: stdtypesimpl.hpp,v 1000.0 2003/10/29 17:31:26 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/stdtypes.hpp>
  43. #include <serial/objistr.hpp>
  44. #include <serial/objostr.hpp>
  45. #include <serial/objcopy.hpp>
  46. #include <serial/serialutil.hpp>
  47. /** @addtogroup TypeInfoCPP
  48.  *
  49.  * @{
  50.  */
  51. BEGIN_NCBI_SCOPE
  52. // throw various exceptions
  53. void ThrowIntegerOverflow(void);
  54. void ThrowIncompatibleValue(void);
  55. void ThrowIllegalCall(void);
  56. #define SERIAL_ENUMERATE_STD_TYPE1(Type) SERIAL_ENUMERATE_STD_TYPE(Type, Type)
  57. #define SERIAL_ENUMERATE_ALL_CHAR_TYPES 
  58.     SERIAL_ENUMERATE_STD_TYPE1(char) 
  59.     SERIAL_ENUMERATE_STD_TYPE(signed char, schar) 
  60.     SERIAL_ENUMERATE_STD_TYPE(unsigned char, uchar)
  61. #if SIZEOF_LONG == 4
  62. #define SERIAL_ENUMERATE_ALL_INTEGRAL_TYPES 
  63.     SERIAL_ENUMERATE_STD_TYPE1(short) 
  64.     SERIAL_ENUMERATE_STD_TYPE(unsigned short, ushort) 
  65.     SERIAL_ENUMERATE_STD_TYPE1(int) 
  66.     SERIAL_ENUMERATE_STD_TYPE1(unsigned) 
  67.     SERIAL_ENUMERATE_STD_TYPE1(long) 
  68.     SERIAL_ENUMERATE_STD_TYPE(unsigned long, ulong) 
  69.     SERIAL_ENUMERATE_STD_TYPE1(Int8) 
  70.     SERIAL_ENUMERATE_STD_TYPE1(Uint8)
  71. #else
  72. #define SERIAL_ENUMERATE_ALL_INTEGRAL_TYPES 
  73.     SERIAL_ENUMERATE_STD_TYPE1(short) 
  74.     SERIAL_ENUMERATE_STD_TYPE(unsigned short, ushort) 
  75.     SERIAL_ENUMERATE_STD_TYPE1(int) 
  76.     SERIAL_ENUMERATE_STD_TYPE1(unsigned) 
  77.     SERIAL_ENUMERATE_STD_TYPE1(Int8) 
  78.     SERIAL_ENUMERATE_STD_TYPE1(Uint8)
  79. #endif
  80. #define SERIAL_ENUMERATE_ALL_FLOAT_TYPES 
  81.     SERIAL_ENUMERATE_STD_TYPE1(float) 
  82.     SERIAL_ENUMERATE_STD_TYPE1(double)
  83. #define SERIAL_ENUMERATE_ALL_STD_TYPES 
  84.     SERIAL_ENUMERATE_STD_TYPE1(bool) 
  85.     SERIAL_ENUMERATE_ALL_CHAR_TYPES 
  86.     SERIAL_ENUMERATE_ALL_INTEGRAL_TYPES 
  87.     SERIAL_ENUMERATE_ALL_FLOAT_TYPES
  88. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoBool : public CPrimitiveTypeInfo
  89. {
  90.     typedef CPrimitiveTypeInfo CParent;
  91. public:
  92.     typedef bool TObjectType;
  93.     CPrimitiveTypeInfoBool(void);
  94.     bool GetValueBool(TConstObjectPtr object) const;
  95.     void SetValueBool(TObjectPtr object, bool value) const;
  96. };
  97. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoChar : public CPrimitiveTypeInfo
  98. {
  99.     typedef CPrimitiveTypeInfo CParent;
  100. public:
  101.     typedef char TObjectType;
  102.     CPrimitiveTypeInfoChar(void);
  103.     char GetValueChar(TConstObjectPtr object) const;
  104.     void SetValueChar(TObjectPtr object, char value) const;
  105.     void GetValueString(TConstObjectPtr object, string& value) const;
  106.     void SetValueString(TObjectPtr object, const string& value) const;
  107. };
  108. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoInt : public CPrimitiveTypeInfo
  109. {
  110.     typedef CPrimitiveTypeInfo CParent;
  111. public:
  112.     typedef Int4 (*TGetInt4Function)(TConstObjectPtr objectPtr);
  113.     typedef Uint4 (*TGetUint4Function)(TConstObjectPtr objectPtr);
  114.     typedef void (*TSetInt4Function)(TObjectPtr objectPtr, Int4 v);
  115.     typedef void (*TSetUint4Function)(TObjectPtr objectPtr, Uint4 v);
  116.     typedef Int8 (*TGetInt8Function)(TConstObjectPtr objectPtr);
  117.     typedef Uint8 (*TGetUint8Function)(TConstObjectPtr objectPtr);
  118.     typedef void (*TSetInt8Function)(TObjectPtr objectPtr, Int8 v);
  119.     typedef void (*TSetUint8Function)(TObjectPtr objectPtr, Uint8 v);
  120.     CPrimitiveTypeInfoInt(size_t size, bool isSigned);
  121.     void SetInt4Functions(TGetInt4Function, TSetInt4Function,
  122.                           TGetUint4Function, TSetUint4Function);
  123.     void SetInt8Functions(TGetInt8Function, TSetInt8Function,
  124.                           TGetUint8Function, TSetUint8Function);
  125.     Int4 GetValueInt4(TConstObjectPtr objectPtr) const;
  126.     Uint4 GetValueUint4(TConstObjectPtr objectPtr) const;
  127.     void SetValueInt4(TObjectPtr objectPtr, Int4 value) const;
  128.     void SetValueUint4(TObjectPtr objectPtr, Uint4 value) const;
  129.     Int8 GetValueInt8(TConstObjectPtr objectPtr) const;
  130.     Uint8 GetValueUint8(TConstObjectPtr objectPtr) const;
  131.     void SetValueInt8(TObjectPtr objectPtr, Int8 value) const;
  132.     void SetValueUint8(TObjectPtr objectPtr, Uint8 value) const;
  133.     
  134. protected:
  135.     TGetInt4Function m_GetInt4;
  136.     TSetInt4Function m_SetInt4;
  137.     TGetUint4Function m_GetUint4;
  138.     TSetUint4Function m_SetUint4;
  139.     TGetInt8Function m_GetInt8;
  140.     TSetInt8Function m_SetInt8;
  141.     TGetUint8Function m_GetUint8;
  142.     TSetUint8Function m_SetUint8;
  143. };
  144. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoDouble : public CPrimitiveTypeInfo
  145. {
  146.     typedef CPrimitiveTypeInfo CParent;
  147. public:
  148.     typedef double TObjectType;
  149.     CPrimitiveTypeInfoDouble(void);
  150.     double GetValueDouble(TConstObjectPtr objectPtr) const;
  151.     void SetValueDouble(TObjectPtr objectPtr, double value) const;
  152. };
  153. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoFloat : public CPrimitiveTypeInfo
  154. {
  155.     typedef CPrimitiveTypeInfo CParent;
  156. public:
  157.     typedef float TObjectType;
  158.     CPrimitiveTypeInfoFloat(void);
  159.     double GetValueDouble(TConstObjectPtr objectPtr) const;
  160.     void SetValueDouble(TObjectPtr objectPtr, double value) const;
  161. };
  162. #if SIZEOF_LONG_DOUBLE != 0
  163. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoLongDouble : public CPrimitiveTypeInfo
  164. {
  165.     typedef CPrimitiveTypeInfo CParent;
  166. public:
  167.     typedef long double TObjectType;
  168.     CPrimitiveTypeInfoLongDouble(void);
  169.     double GetValueDouble(TConstObjectPtr objectPtr) const;
  170.     void SetValueDouble(TObjectPtr objectPtr, double value) const;
  171.     virtual long double GetValueLDouble(TConstObjectPtr objectPtr) const;
  172.     virtual void SetValueLDouble(TObjectPtr objectPtr,
  173.                                  long double value) const;
  174. };
  175. #endif
  176. // CTypeInfo for C++ STL type string
  177. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoString : public CPrimitiveTypeInfo
  178. {
  179.     typedef CPrimitiveTypeInfo CParent;
  180. public:
  181.     enum EType {
  182.         eStringTypeVisible,
  183.         eStringTypeUTF8
  184.     };
  185.     typedef string TObjectType;
  186.     CPrimitiveTypeInfoString(EType type = eStringTypeVisible);
  187.     char GetValueChar(TConstObjectPtr objectPtr) const;
  188.     void SetValueChar(TObjectPtr objectPtr, char value) const;
  189.     void GetValueString(TConstObjectPtr objectPtr, string& value) const;
  190.     void SetValueString(TObjectPtr objectPtr, const string& value) const;
  191.     EType GetStringType(void)
  192.     {
  193.         return m_Type;
  194.     }
  195. private:
  196.     EType m_Type;
  197. };
  198. template<typename T>
  199. class CPrimitiveTypeInfoCharPtr : public CPrimitiveTypeInfo
  200. {
  201.     typedef CPrimitiveTypeInfo CParent;
  202. public:
  203.     typedef T TObjectType;
  204.     CPrimitiveTypeInfoCharPtr(void);
  205.     char GetValueChar(TConstObjectPtr objectPtr) const;
  206.     void SetValueChar(TObjectPtr objectPtr, char value) const;
  207.     void GetValueString(TConstObjectPtr objectPtr, string& value) const;
  208.     void SetValueString(TObjectPtr objectPtr, const string& value) const;
  209. };
  210. template<typename Char>
  211. class CCharVectorTypeInfo : public CPrimitiveTypeInfo
  212. {
  213.     typedef CPrimitiveTypeInfo CParent;
  214. public:
  215.     typedef vector<Char> TObjectType;
  216.     typedef Char TChar;
  217.     CCharVectorTypeInfo(void);
  218.     void GetValueString(TConstObjectPtr objectPtr, string& value) const;
  219.     void SetValueString(TObjectPtr objectPtr, const string& value) const;
  220.     void GetValueOctetString(TConstObjectPtr objectPtr,
  221.                              vector<char>& value) const;
  222.     void SetValueOctetString(TObjectPtr objectPtr,
  223.                              const vector<char>& value) const;
  224. };
  225. class NCBI_XSERIAL_EXPORT CPrimitiveTypeInfoAnyContent : public CPrimitiveTypeInfo
  226. {
  227.     typedef CPrimitiveTypeInfo CParent;
  228. public:
  229.     CPrimitiveTypeInfoAnyContent(void);
  230. };
  231. /* @} */
  232. //#include <serial/stdtypesimpl.inl>
  233. END_NCBI_SCOPE
  234. #endif  /* STDTYPESIMPL__HPP */
  235. /* ---------------------------------------------------------------------------
  236. * $Log: stdtypesimpl.hpp,v $
  237. * Revision 1000.0  2003/10/29 17:31:26  gouriano
  238. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.12
  239. *
  240. * Revision 1.12  2003/08/13 15:47:02  gouriano
  241. * implemented serialization of AnyContent objects
  242. *
  243. * Revision 1.11  2003/05/22 20:08:42  gouriano
  244. * added UTF8 strings
  245. *
  246. * Revision 1.10  2003/04/15 16:18:59  siyan
  247. * Added doxygen support
  248. *
  249. * Revision 1.9  2002/12/23 18:38:51  dicuccio
  250. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  251. * Moved all CVS logs to the end.
  252. *
  253. * Revision 1.8  2000/12/15 15:38:02  vasilche
  254. * Added support of Int8 and long double.
  255. * Enum values now have type Int4 instead of long.
  256. *
  257. * Revision 1.7  2000/10/13 16:28:32  vasilche
  258. * Reduced header dependency.
  259. * Avoid use of templates with virtual methods.
  260. * Reduced amount of different maps used.
  261. * All this lead to smaller compiled code size (libraries and programs).
  262. *
  263. * Revision 1.6  2000/09/19 20:16:53  vasilche
  264. * Fixed type in CStlClassInfo_auto_ptr.
  265. * Added missing include serialutil.hpp.
  266. *
  267. * Revision 1.5  2000/09/18 20:00:11  vasilche
  268. * Separated CVariantInfo and CMemberInfo.
  269. * Implemented copy hooks.
  270. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  271. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  272. *
  273. * Revision 1.4  2000/09/01 13:16:03  vasilche
  274. * Implemented class/container/choice iterators.
  275. * Implemented CObjectStreamCopier for copying data without loading into memory.
  276. *
  277. * Revision 1.3  2000/07/03 20:47:18  vasilche
  278. * Removed unused variables/functions.
  279. *
  280. * Revision 1.2  2000/07/03 19:04:25  vasilche
  281. * Fixed type references in templates.
  282. *
  283. * Revision 1.1  2000/07/03 18:42:37  vasilche
  284. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  285. * Reduced header dependency.
  286. *
  287. * ===========================================================================
  288. */