📄 objostr.hpp
字号:
/* * =========================================================================== * PRODUCTION $Log: objostr.hpp,v $ * PRODUCTION Revision 1000.4 2004/06/01 19:39:02 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.86 * PRODUCTION * =========================================================================== */#ifndef OBJOSTR__HPP#define OBJOSTR__HPP/* $Id: objostr.hpp,v 1000.4 2004/06/01 19:39:02 gouriano Exp $* ===========================================================================** PUBLIC DOMAIN NOTICE* National Center for Biotechnology Information** This software/database is a "United States Government Work" under the* terms of the United States Copyright Act. It was written as part of* the author's official duties as a United States Government employee and* thus cannot be copyrighted. This software/database is freely available* to the public for use. The National Library of Medicine and the U.S.* Government have not placed any restriction on its use or reproduction.** Although all reasonable efforts have been taken to ensure the accuracy* and reliability of the software and data, the NLM and the U.S.* Government do not and cannot warrant the performance or results that* may be obtained by using this software or data. The NLM and the U.S.* Government disclaim all warranties, express or implied, including* warranties of performance, merchantability or fitness for any particular* purpose.** Please cite the author in any work or product based on this material.** ===========================================================================** Author: Eugene Vasilchenko** File Description:* !!! PUT YOUR DESCRIPTION HERE !!!*/#include <corelib/ncbistd.hpp>#include <corelib/ncbifloat.h>#include <corelib/ncbiobj.hpp>#include <corelib/ncbiutil.hpp>#include <serial/serialdef.hpp>#include <serial/typeinfo.hpp>#include <util/strbuffer.hpp>#include <serial/objlist.hpp>#include <serial/objstack.hpp>#include <serial/hookdatakey.hpp>#include <serial/objhook.hpp>#include <serial/pathhook.hpp>/** @addtogroup ObjStreamSupport * * @{ */struct asnio;BEGIN_NCBI_SCOPEclass CMemberId;class CDelayBuffer;class CConstObjectInfo;class CConstObjectInfoMI;class CWriteObjectHook;class CWriteClassMembersHook;class CWriteChoiceVariantHook;class CContainerTypeInfo;class CClassTypeInfo;class CChoiceTypeInfo;class CObjectStreamCopier;class CAliasTypeInfo;class CWriteObjectInfo;class CWriteObjectList;class NCBI_XSERIAL_EXPORT CObjectOStream : public CObjectStack{public: typedef size_t TObjectIndex; // open methods static CObjectOStream* Open(ESerialDataFormat format, const string& fileName, TSerialOpenFlags openFlags = 0); static CObjectOStream* Open(const string& fileName, ESerialDataFormat format); static CObjectOStream* Open(ESerialDataFormat format, CNcbiOstream& outStream, bool deleteOutStream = false); void Close(void); void ResetLocalHooks(void); // when enabled, stream verifies data on output // and throws CUnassignedMember exception // for this particular stream void SetVerifyData(ESerialVerifyData verify); ESerialVerifyData GetVerifyData(void) const; // for streams created by the current thread static void SetVerifyDataThread(ESerialVerifyData verify); // for streams created by the current process static void SetVerifyDataGlobal(ESerialVerifyData verify); void SetUseIndentation(bool set); bool GetUseIndentation(void) const; // constructorsprotected: CObjectOStream(ESerialDataFormat format, CNcbiOstream& out, bool deleteOut = false);public: virtual ~CObjectOStream(void); // get data format ESerialDataFormat GetDataFormat(void) const; // USER INTERFACE // flush buffer void FlushBuffer(void); // flush buffer and underlying stream void Flush(void); // root writer void Write(const CConstObjectInfo& object); void Write(TConstObjectPtr object, TTypeInfo type); void Write(TConstObjectPtr object, const CTypeRef& type); // subtree writer void WriteObject(const CConstObjectInfo& object); void WriteObject(TConstObjectPtr object, TTypeInfo typeInfo); void CopyObject(TTypeInfo objectType, CObjectStreamCopier& copier); void WriteSeparateObject(const CConstObjectInfo& object); // internal writer void WriteExternalObject(TConstObjectPtr object, TTypeInfo typeInfo); // member interface void WriteClassMember(const CConstObjectInfoMI& member); // choice variant interface void WriteChoiceVariant(const CConstObjectInfoCV& member); // Separator management string GetSeparator(void) const; void SetSeparator(const string sep); // Controls auto-output of the separator after each object. By default // this flag is true for text ASN.1 streams only. bool GetAutoSeparator(void); void SetAutoSeparator(bool value); CObjectOStream& operator<< (CObjectOStream& (*mod)(CObjectOStream& os)); friend CObjectOStream& Separator(CObjectOStream& os); // END OF USER INTERFACE // low level writers // root object virtual void WriteFileHeader(TTypeInfo type); virtual void EndOfWrite(void); // std C types readers // bool void WriteStd(const bool& data); // char void WriteStd(const char& data); // integer number void WriteStd(const signed char& data); void WriteStd(const unsigned char& data); void WriteStd(const short& data); void WriteStd(const unsigned short& data); void WriteStd(const int& data); void WriteStd(const unsigned int& data);#if SIZEOF_LONG == 4 void WriteStd(const long& data); void WriteStd(const unsigned long& data);#endif void WriteStd(const Int8& data); void WriteStd(const Uint8& data); // float number void WriteStd(const float& data); void WriteStd(const double& data);#if SIZEOF_LONG_DOUBLE != 0 void WriteStd(const long double& data);#endif // string void WriteStd(const string& data); void WriteStd(const CStringUTF8& data); // C string; VisualAge can't cope with refs here. void WriteStd(const char* const data); void WriteStd(char* const data); // primitive writers // bool virtual void WriteBool(bool data) = 0; // char virtual void WriteChar(char data) = 0; // integer numbers virtual void WriteInt4(Int4 data) = 0; virtual void WriteUint4(Uint4 data) = 0; virtual void WriteInt8(Int8 data) = 0; virtual void WriteUint8(Uint8 data) = 0; // float numbers virtual void WriteFloat(float data); virtual void WriteDouble(double data) = 0;#if SIZEOF_LONG_DOUBLE != 0 virtual void WriteLDouble(long double data);#endif // string virtual void WriteString(const string& str, EStringType type = eStringTypeVisible) = 0; virtual void CopyString(CObjectIStream& in) = 0; // StringStore virtual void WriteStringStore(const string& data) = 0; virtual void CopyStringStore(CObjectIStream& in) = 0; // C string virtual void WriteCString(const char* str) = 0; // NULL virtual void WriteNull(void) = 0; // enum virtual void WriteEnum(const CEnumeratedTypeValues& values, TEnumValueType value) = 0; virtual void CopyEnum(const CEnumeratedTypeValues& values, CObjectIStream& in) = 0; // any content object virtual void WriteAnyContentObject(const CAnyContentObject& obj) = 0; virtual void CopyAnyContentObject(CObjectIStream& in) = 0; // delayed buffer virtual bool Write(CByteSource& source); // low level readers: enum EFailFlags { fNoError = 0, eNoError = fNoError, fEOF = 1 << 0, eEOF = fEOF, fWriteError = 1 << 1, eWriteError = fWriteError, fFormatError = 1 << 2, eFormatError = fFormatError, fOverflow = 1 << 3, eOverflow = fOverflow, fInvalidData = 1 << 4, eInvalidData = fInvalidData, fIllegalCall = 1 << 5, eIllegalCall = fIllegalCall, fFail = 1 << 6, eFail = fFail, fNotOpen = 1 << 7, eNotOpen = fNotOpen, fUnassigned = 1 << 8, eUnassigned = fUnassigned }; typedef int TFailFlags; bool fail(void) const; TFailFlags GetFailFlags(void) const; TFailFlags SetFailFlagsNoError(TFailFlags flags); TFailFlags SetFailFlags(TFailFlags flags, const char* message); TFailFlags ClearFailFlags(TFailFlags flags); bool InGoodState(void); virtual string GetStackTrace(void) const; virtual string GetPosition(void) const; size_t GetStreamOffset(void) const; enum EFlags { fFlagNone = 0, eFlagNone = fFlagNone, fFlagAllowNonAsciiChars = 1 << 0, eFlagAllowNonAsciiChars = fFlagAllowNonAsciiChars }; typedef int TFlags; TFlags GetFlags(void) const; TFlags SetFlags(TFlags flags); TFlags ClearFlags(TFlags flags); void ThrowError1(const char* file, int line, TFailFlags fail, const char* message); void ThrowError1(const char* file, int line, TFailFlags fail, const string& message);#define ThrowError(flag, mess) ThrowError1(__FILE__, __LINE__,flag,mess) class ByteBlock; friend class ByteBlock; class ByteBlock { public: ByteBlock(CObjectOStream& out, size_t length); ~ByteBlock(void); CObjectOStream& GetStream(void) const; size_t GetLength(void) const; void Write(const void* bytes, size_t length); void End(void); private: CObjectOStream& m_Stream; size_t m_Length; bool m_Ended; }; class CharBlock; friend class CharBlock; class NCBI_XSERIAL_EXPORT CharBlock { public: CharBlock(CObjectOStream& out, size_t length); ~CharBlock(void); CObjectOStream& GetStream(void) const; size_t GetLength(void) const; void Write(const char* chars, size_t length); void End(void); private: CObjectOStream& m_Stream; size_t m_Length; bool m_Ended; };#if HAVE_NCBI_C class AsnIo { public: AsnIo(CObjectOStream& out, const string& rootTypeName); ~AsnIo(void); CObjectOStream& GetStream(void) const; void Write(const char* data, size_t length); void End(void); operator asnio*(void); asnio* operator->(void); const string& GetRootTypeName(void) const; private: CObjectOStream& m_Stream; string m_RootTypeName; asnio* m_AsnIo; bool m_Ended; public: size_t m_Count; }; friend class AsnIo;public:#endif // mid level I/O // named type (alias) MLIOVIR void WriteNamedType(TTypeInfo namedTypeInfo, TTypeInfo typeInfo, TConstObjectPtr object); // container MLIOVIR void WriteContainer(const CContainerTypeInfo* containerType, TConstObjectPtr containerPtr); void WriteContainerElement(const CConstObjectInfo& element); // class void WriteClassRandom(const CClassTypeInfo* classType, TConstObjectPtr classPtr); void WriteClassSequential(const CClassTypeInfo* classType, TConstObjectPtr classPtr); MLIOVIR void WriteClass(const CClassTypeInfo* objectType, TConstObjectPtr objectPtr); MLIOVIR void WriteClassMember(const CMemberId& memberId, TTypeInfo memberType, TConstObjectPtr memberPtr); MLIOVIR bool WriteClassMember(const CMemberId& memberId, const CDelayBuffer& buffer); // choice MLIOVIR void WriteChoice(const CChoiceTypeInfo* choiceType, TConstObjectPtr choicePtr); // alias MLIOVIR void WriteAlias(const CAliasTypeInfo* aliasType, TConstObjectPtr aliasPtr); // COPY // named type (alias) MLIOVIR void CopyNamedType(TTypeInfo namedTypeInfo, TTypeInfo typeInfo, CObjectStreamCopier& copier); // container MLIOVIR void CopyContainer(const CContainerTypeInfo* containerType, CObjectStreamCopier& copier); // class MLIOVIR void CopyClassRandom(const CClassTypeInfo* objectType, CObjectStreamCopier& copier); MLIOVIR void CopyClassSequential(const CClassTypeInfo* objectType, CObjectStreamCopier& copier); // choice MLIOVIR void CopyChoice(const CChoiceTypeInfo* choiceType, CObjectStreamCopier& copier); // alias MLIOVIR void CopyAlias(const CAliasTypeInfo* AliasType, CObjectStreamCopier& copier); // low level I/O // named type virtual void BeginNamedType(TTypeInfo namedTypeInfo); virtual void EndNamedType(void); // container virtual void BeginContainer(const CContainerTypeInfo* containerType) = 0; virtual void EndContainer(void); virtual void BeginContainerElement(TTypeInfo elementType); virtual void EndContainerElement(void);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -