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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objostrasn.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2003/12/02 20:33:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.47
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJOSTRASN__HPP
  10. #define OBJOSTRASN__HPP
  11. /*  $Id: objostrasn.hpp,v 1000.1 2003/12/02 20:33:24 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/objostr.hpp>
  43. /** @addtogroup ObjStreamSupport
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. class NCBI_XSERIAL_EXPORT CObjectOStreamAsn : public CObjectOStream
  49. {
  50. public:
  51.     CObjectOStreamAsn(CNcbiOstream& out,
  52.                       EFixNonPrint how = eFNP_Default);
  53.     CObjectOStreamAsn(CNcbiOstream& out,
  54.                       bool deleteOut,
  55.                       EFixNonPrint how = eFNP_Default);
  56.     virtual ~CObjectOStreamAsn(void);
  57.     virtual string GetPosition(void) const;
  58.     virtual void WriteFileHeader(TTypeInfo type);
  59.     virtual void WriteEnum(const CEnumeratedTypeValues& values,
  60.                            TEnumValueType value);
  61.     virtual void CopyEnum(const CEnumeratedTypeValues& values,
  62.                           CObjectIStream& in);
  63.     void WriteEnum(TEnumValueType value, const string& valueName);
  64.     EFixNonPrint FixNonPrint(EFixNonPrint how)
  65.         {
  66.             EFixNonPrint tmp = m_FixMethod;
  67.             m_FixMethod = how;
  68.             return tmp;
  69.         }
  70. protected:
  71.     virtual void WriteBool(bool data);
  72.     virtual void WriteChar(char data);
  73.     virtual void WriteInt4(Int4 data);
  74.     virtual void WriteUint4(Uint4 data);
  75.     virtual void WriteInt8(Int8 data);
  76.     virtual void WriteUint8(Uint8 data);
  77.     virtual void WriteFloat(float data);
  78.     virtual void WriteDouble(double data);
  79.     void WriteDouble2(double data, size_t digits);
  80.     virtual void WriteCString(const char* str);
  81.     virtual void WriteString(const string& str,
  82.                              EStringType type = eStringTypeVisible);
  83.     virtual void WriteStringStore(const string& str);
  84.     virtual void CopyString(CObjectIStream& in);
  85.     virtual void CopyStringStore(CObjectIStream& in);
  86.     virtual void WriteNullPointer(void);
  87.     virtual void WriteObjectReference(TObjectIndex index);
  88.     virtual void WriteOtherBegin(TTypeInfo typeInfo);
  89.     virtual void WriteOther(TConstObjectPtr object, TTypeInfo typeInfo);
  90.     void WriteId(const string& str);
  91.     void WriteNull(void);
  92.     virtual void WriteAnyContentObject(const CAnyContentObject& obj);
  93.     virtual void CopyAnyContentObject(CObjectIStream& in);
  94. #ifdef VIRTUAL_MID_LEVEL_IO
  95.     virtual void WriteContainer(const CContainerTypeInfo* containerType,
  96.                                 TConstObjectPtr containerPtr);
  97.     virtual void WriteClass(const CClassTypeInfo* objectType,
  98.                             TConstObjectPtr objectPtr);
  99.     virtual void WriteClassMember(const CMemberId& memberId,
  100.                                   TTypeInfo memberType,
  101.                                   TConstObjectPtr memberPtr);
  102.     virtual bool WriteClassMember(const CMemberId& memberId,
  103.                                   const CDelayBuffer& buffer);
  104.     virtual void WriteChoice(const CChoiceTypeInfo* choiceType,
  105.                              TConstObjectPtr choicePtr);
  106.     // COPY
  107.     virtual void CopyContainer(const CContainerTypeInfo* containerType,
  108.                                CObjectStreamCopier& copier);
  109.     virtual void CopyClassRandom(const CClassTypeInfo* objectType,
  110.                                  CObjectStreamCopier& copier);
  111.     virtual void CopyClassSequential(const CClassTypeInfo* objectType,
  112.                                      CObjectStreamCopier& copier);
  113.     virtual void CopyChoice(const CChoiceTypeInfo* choiceType,
  114.                             CObjectStreamCopier& copier);
  115. #endif
  116.     // low level I/O
  117.     virtual void BeginContainer(const CContainerTypeInfo* containerType);
  118.     virtual void EndContainer(void);
  119.     virtual void BeginContainerElement(TTypeInfo elementType);
  120.     virtual void BeginClass(const CClassTypeInfo* classInfo);
  121.     virtual void EndClass(void);
  122.     virtual void BeginClassMember(const CMemberId& id);
  123.     virtual void BeginChoiceVariant(const CChoiceTypeInfo* choiceType,
  124.                                     const CMemberId& id);
  125.     virtual void BeginBytes(const ByteBlock& block);
  126.     virtual void WriteBytes(const ByteBlock& block,
  127.                             const char* bytes, size_t length);
  128.     virtual void EndBytes(const ByteBlock& block);
  129.     virtual void BeginChars(const CharBlock& block);
  130.     virtual void WriteChars(const CharBlock& block,
  131.                             const char* chars, size_t length);
  132.     virtual void EndChars(const CharBlock& block);
  133.     // Write current separator to the stream
  134.     virtual void WriteSeparator(void);
  135. private:
  136.     void WriteString(const char* str, size_t length);
  137.     void WriteMemberId(const CMemberId& id);
  138.     void StartBlock(void);
  139.     void NextElement(void);
  140.     void EndBlock(void);
  141.     bool m_BlockStart;
  142.     EFixNonPrint m_FixMethod; // method of fixing non-printable chars
  143. };
  144. /* @} */
  145. //#include <serial/objostrasn.inl>
  146. END_NCBI_SCOPE
  147. #endif  /* OBJOSTRASN__HPP */
  148. /* ---------------------------------------------------------------------------
  149. * $Log: objostrasn.hpp,v $
  150. * Revision 1000.1  2003/12/02 20:33:24  gouriano
  151. * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.47
  152. *
  153. * Revision 1.47  2003/11/26 19:59:39  vasilche
  154. * GetPosition() and GetDataFormat() methods now are implemented
  155. * in parent classes CObjectIStream and CObjectOStream to avoid
  156. * pure virtual method call in destructors.
  157. *
  158. * Revision 1.46  2003/08/13 15:47:02  gouriano
  159. * implemented serialization of AnyContent objects
  160. *
  161. * Revision 1.45  2003/05/22 20:08:42  gouriano
  162. * added UTF8 strings
  163. *
  164. * Revision 1.44  2003/04/15 16:18:29  siyan
  165. * Added doxygen support
  166. *
  167. * Revision 1.43  2003/03/26 16:13:33  vasilche
  168. * Removed TAB symbols. Some formatting.
  169. *
  170. * Revision 1.42  2002/12/23 18:38:51  dicuccio
  171. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  172. * Moved all CVS logs to the end.
  173. *
  174. * Revision 1.41  2002/10/25 14:49:29  vasilche
  175. * NCBI C Toolkit compatibility code extracted to libxcser library.
  176. * Serial streams flags names were renamed to fXxx.
  177. *
  178. * Names of flags
  179. *
  180. * Revision 1.40  2002/03/07 22:02:00  grichenk
  181. * Added "Separator" modifier for CObjectOStream
  182. *
  183. * Revision 1.39  2001/10/17 20:41:20  grichenk
  184. * Added CObjectOStream::CharBlock class
  185. *
  186. * Revision 1.38  2001/06/11 14:34:55  grichenk
  187. * Added support for numeric tags in ASN.1 specifications and data streams.
  188. *
  189. * Revision 1.37  2001/06/07 17:12:46  grichenk
  190. * Redesigned checking and substitution of non-printable characters
  191. * in VisibleString
  192. *
  193. * Revision 1.36  2001/05/17 14:59:47  lavr
  194. * Typos corrected
  195. *
  196. * Revision 1.35  2000/12/15 21:28:48  vasilche
  197. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  198. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  199. * TByte typedef replaced by Uint1.
  200. *
  201. * Revision 1.34  2000/12/15 15:38:01  vasilche
  202. * Added support of Int8 and long double.
  203. * Enum values now have type Int4 instead of long.
  204. *
  205. * Revision 1.33  2000/10/20 15:51:27  vasilche
  206. * Fixed data error processing.
  207. * Added interface for constructing container objects directly into output stream.
  208. * object.hpp, object.inl and object.cpp were split to
  209. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  210. *
  211. * Revision 1.32  2000/10/04 19:18:54  vasilche
  212. * Fixed processing floating point data.
  213. *
  214. * Revision 1.31  2000/09/29 16:18:14  vasilche
  215. * Fixed binary format encoding/decoding on 64 bit compulers.
  216. * Implemented CWeakMap<> for automatic cleaning map entries.
  217. * Added cleaning local hooks via CWeakMap<>.
  218. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  219. * Added some user interface methods to CObjectIStream, CObjectOStream and
  220. * CObjectStreamCopier.
  221. *
  222. * Revision 1.30  2000/09/18 20:00:07  vasilche
  223. * Separated CVariantInfo and CMemberInfo.
  224. * Implemented copy hooks.
  225. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  226. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  227. *
  228. * Revision 1.29  2000/09/01 13:16:01  vasilche
  229. * Implemented class/container/choice iterators.
  230. * Implemented CObjectStreamCopier for copying data without loading into memory.
  231. *
  232. * Revision 1.28  2000/08/15 19:44:41  vasilche
  233. * Added Read/Write hooks:
  234. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  235. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  236. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  237. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  238. *
  239. * Revision 1.27  2000/07/03 18:42:36  vasilche
  240. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  241. * Reduced header dependency.
  242. *
  243. * Revision 1.26  2000/06/16 16:31:07  vasilche
  244. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  245. *
  246. * Revision 1.25  2000/06/07 19:45:43  vasilche
  247. * Some code cleaning.
  248. * Macros renaming in more clear way.
  249. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  250. *
  251. * Revision 1.24  2000/06/01 19:06:57  vasilche
  252. * Added parsing of XML data.
  253. *
  254. * Revision 1.23  2000/05/24 20:08:14  vasilche
  255. * Implemented XML dump.
  256. *
  257. * Revision 1.22  2000/04/28 16:58:03  vasilche
  258. * Added classes CByteSource and CByteSourceReader for generic reading.
  259. * Added delayed reading of choice variants.
  260. *
  261. * Revision 1.21  2000/04/13 14:50:18  vasilche
  262. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  263. *
  264. * Revision 1.20  2000/04/06 16:10:51  vasilche
  265. * Fixed bug with iterators in choices.
  266. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  267. * Added output buffering to text ASN.1 data.
  268. *
  269. * Revision 1.19  2000/01/10 20:12:37  vasilche
  270. * Fixed duplicate argument names.
  271. * Fixed conflict between template and variable name.
  272. *
  273. * Revision 1.18  2000/01/10 19:46:32  vasilche
  274. * Fixed encoding/decoding of REAL type.
  275. * Fixed encoding/decoding of StringStore.
  276. * Fixed encoding/decoding of NULL type.
  277. * Fixed error reporting.
  278. * Reduced object map (only classes).
  279. *
  280. * Revision 1.17  1999/09/24 18:19:14  vasilche
  281. * Removed dependency on NCBI toolkit.
  282. *
  283. * Revision 1.16  1999/09/23 18:56:53  vasilche
  284. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  285. *
  286. * Revision 1.15  1999/09/22 20:11:50  vasilche
  287. * Modified for compilation on IRIX native c++ compiler.
  288. *
  289. * Revision 1.14  1999/08/13 15:53:44  vasilche
  290. * C++ analog of asntool: datatool
  291. *
  292. * Revision 1.13  1999/07/22 17:33:44  vasilche
  293. * Unified reading/writing of objects in all three formats.
  294. *
  295. * Revision 1.12  1999/07/21 14:19:59  vasilche
  296. * Added serialization of bool.
  297. *
  298. * Revision 1.11  1999/07/19 15:50:18  vasilche
  299. * Added interface to old ASN.1 routines.
  300. * Added naming of key/value in STL map.
  301. *
  302. * Revision 1.10  1999/07/14 18:58:04  vasilche
  303. * Fixed ASN.1 types/field naming.
  304. *
  305. * Revision 1.9  1999/07/09 16:32:54  vasilche
  306. * Added OCTET STRING write/read.
  307. *
  308. * Revision 1.8  1999/07/07 21:15:03  vasilche
  309. * Cleaned processing of string types (string, char*, const char*).
  310. *
  311. * Revision 1.7  1999/07/02 21:31:47  vasilche
  312. * Implemented reading from ASN.1 binary format.
  313. *
  314. * Revision 1.6  1999/07/01 17:55:20  vasilche
  315. * Implemented ASN.1 binary write.
  316. *
  317. * Revision 1.5  1999/06/30 16:04:32  vasilche
  318. * Added support for old ASN.1 structures.
  319. *
  320. * Revision 1.4  1999/06/24 14:44:41  vasilche
  321. * Added binary ASN.1 output.
  322. *
  323. * Revision 1.3  1999/06/17 20:42:02  vasilche
  324. * Fixed storing/loading of pointers.
  325. *
  326. * Revision 1.2  1999/06/16 20:35:24  vasilche
  327. * Cleaned processing of blocks of data.
  328. * Added input from ASN.1 text format.
  329. *
  330. * Revision 1.1  1999/06/15 16:20:04  vasilche
  331. * Added ASN.1 object output stream.
  332. *
  333. * Revision 1.2  1999/06/10 21:06:40  vasilche
  334. * Working binary output and almost working binary input.
  335. *
  336. * Revision 1.1  1999/06/07 19:30:18  vasilche
  337. * More bug fixes
  338. *
  339. * ===========================================================================
  340. */