📄 objistr.cpp
字号:
CContainerTypeInfo::CIterator iter; bool old_element = containerType->InitIterator(iter, containerPtr); while ( BeginContainerElement(elementType) ) { if ( old_element ) { elementType->ReadData(*this, containerType->GetElementPtr(iter)); old_element = containerType->NextElement(iter); } else { containerType->AddElement(containerPtr, *this); } EndContainerElement(); } if ( old_element ) { containerType->EraseAllElements(iter); } END_OBJECT_FRAME(); EndContainer(); END_OBJECT_FRAME();}void CObjectIStream::SkipContainer(const CContainerTypeInfo* containerType){ BEGIN_OBJECT_FRAME2(eFrameArray, containerType); BeginContainer(containerType); TTypeInfo elementType = containerType->GetElementType(); BEGIN_OBJECT_FRAME2(eFrameArrayElement, elementType); while ( BeginContainerElement(elementType) ) { SkipObject(elementType); EndContainerElement(); } END_OBJECT_FRAME(); EndContainer(); END_OBJECT_FRAME();}void CObjectIStream::EndClass(void){}void CObjectIStream::EndClassMember(void){}void CObjectIStream::ReadClassRandom(const CClassTypeInfo* classType, TObjectPtr classPtr){ BEGIN_OBJECT_FRAME2(eFrameClass, classType); BeginClass(classType); ReadClassRandomContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType)) != kInvalidMember ) { ReadClassRandomContentsMember(classPtr); EndClassMember(); } ReadClassRandomContentsEnd(); EndClass(); END_OBJECT_FRAME();}void CObjectIStream::ReadClassSequential(const CClassTypeInfo* classType, TObjectPtr classPtr){ TMemberIndex prevIndex = kInvalidMember; BEGIN_OBJECT_FRAME2(eFrameClass, classType); BeginClass(classType); ReadClassSequentialContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType, *pos)) != kInvalidMember ) { if ((prevIndex != kInvalidMember) && (prevIndex > index)) { const CMemberInfo *mem_info = classType->GetMemberInfo(index); if (mem_info->GetId().HaveNoPrefix()) { UndoClassMember(); break; } } prevIndex = index; ReadClassSequentialContentsMember(classPtr); EndClassMember(); } ReadClassSequentialContentsEnd(classPtr); EndClass(); END_OBJECT_FRAME();}void CObjectIStream::SkipClassRandom(const CClassTypeInfo* classType){ BEGIN_OBJECT_FRAME2(eFrameClass, classType); BeginClass(classType); SkipClassRandomContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType)) != kInvalidMember ) { SkipClassRandomContentsMember(); EndClassMember(); } SkipClassRandomContentsEnd(); EndClass(); END_OBJECT_FRAME();}void CObjectIStream::SkipClassSequential(const CClassTypeInfo* classType){ BEGIN_OBJECT_FRAME2(eFrameClass, classType); BeginClass(classType); SkipClassSequentialContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType, *pos)) != kInvalidMember ) { SkipClassSequentialContentsMember(); EndClassMember(); } SkipClassSequentialContentsEnd(); EndClass(); END_OBJECT_FRAME();}void CObjectIStream::BeginChoice(const CChoiceTypeInfo* /*choiceType*/){}void CObjectIStream::EndChoice(void){}void CObjectIStream::EndChoiceVariant(void){}void CObjectIStream::ReadChoice(const CChoiceTypeInfo* choiceType, TObjectPtr choicePtr){ BEGIN_OBJECT_FRAME2(eFrameChoice, choiceType); BeginChoice(choiceType); BEGIN_OBJECT_FRAME(eFrameChoiceVariant); TMemberIndex index = BeginChoiceVariant(choiceType); _ASSERT(index != kInvalidMember); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); SetTopMemberId(variantInfo->GetId()); variantInfo->ReadVariant(*this, choicePtr); EndChoiceVariant(); END_OBJECT_FRAME(); EndChoice(); END_OBJECT_FRAME();}void CObjectIStream::SkipChoice(const CChoiceTypeInfo* choiceType){ BEGIN_OBJECT_FRAME2(eFrameChoice, choiceType); BeginChoice(choiceType); BEGIN_OBJECT_FRAME(eFrameChoiceVariant); TMemberIndex index = BeginChoiceVariant(choiceType); if ( index == kInvalidMember ) ThrowError(fFormatError,"choice variant id expected"); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); SetTopMemberId(variantInfo->GetId()); variantInfo->SkipVariant(*this); EndChoiceVariant(); END_OBJECT_FRAME(); EndChoice(); END_OBJECT_FRAME();}void CObjectIStream::ReadAlias(const CAliasTypeInfo* aliasType, TObjectPtr aliasPtr){ ReadNamedType(aliasType, aliasType->GetPointedType(), aliasType->GetDataPtr(aliasPtr));}void CObjectIStream::SkipAlias(const CAliasTypeInfo* aliasType){ SkipNamedType(aliasType, aliasType->GetPointedType());}/////////////////////////////////////////////////////////////////////////// CObjectIStream::ByteBlock//CObjectIStream::ByteBlock::ByteBlock(CObjectIStream& in) : m_Stream(in), m_KnownLength(false), m_Ended(false), m_Length(1){ in.BeginBytes(*this);}CObjectIStream::ByteBlock::~ByteBlock(void){ if ( !m_Ended ) { try { GetStream().Unended("byte block not fully read"); } catch (...) { ERR_POST("unended byte block"); } }}void CObjectIStream::ByteBlock::End(void){ _ASSERT(!m_Ended); if ( m_Length == 0 ) { GetStream().EndBytes(*this); m_Ended = true; }}size_t CObjectIStream::ByteBlock::Read(void* dst, size_t needLength, bool forceLength){ size_t length; if ( KnownLength() ) { if ( m_Length < needLength ) length = m_Length; else length = needLength; } else { if ( m_Length == 0 ) length = 0; else length = needLength; } if ( length == 0 ) { if ( forceLength && needLength != 0 ) GetStream().ThrowError(fReadError, "read fault"); return 0; } length = GetStream().ReadBytes(*this, static_cast<char*>(dst), length); if ( KnownLength() ) m_Length -= length; if ( forceLength && needLength != length ) GetStream().ThrowError(fReadError, "read fault"); return length;}/////////////////////////////////////////////////////////////////////////// CObjectIStream::CharBlock//CObjectIStream::CharBlock::CharBlock(CObjectIStream& in) : m_Stream(in), m_KnownLength(false), m_Ended(false), m_Length(1){ in.BeginChars(*this);}CObjectIStream::CharBlock::~CharBlock(void){ if ( !m_Ended ) { try { GetStream().Unended("char block not fully read"); } catch (...) { ERR_POST("unended char block"); } }}void CObjectIStream::CharBlock::End(void){ _ASSERT(!m_Ended); if ( m_Length == 0 ) { GetStream().EndChars(*this); m_Ended = true; }}size_t CObjectIStream::CharBlock::Read(char* dst, size_t needLength, bool forceLength){ size_t length; if ( KnownLength() ) { if ( m_Length < needLength ) length = m_Length; else length = needLength; } else { if ( m_Length == 0 ) length = 0; else length = needLength; } if ( length == 0 ) { if ( forceLength && needLength != 0 ) GetStream().ThrowError(fReadError, "read fault"); return 0; } length = GetStream().ReadChars(*this, dst, length); if ( KnownLength() ) m_Length -= length; if ( forceLength && needLength != length ) GetStream().ThrowError(fReadError, "read fault"); return length;}void CObjectIStream::EndBytes(const ByteBlock& /*b*/){}void CObjectIStream::EndChars(const CharBlock& /*b*/){}Int1 CObjectIStream::ReadInt1(void){ Int4 data = ReadInt4(); Int1 ret = Int1(data); if ( ret != data ) ThrowError(fOverflow, "integer overflow"); return ret;}Uint1 CObjectIStream::ReadUint1(void){ Uint4 data = ReadUint4(); Uint1 ret = Uint1(data); if ( ret != data ) ThrowError(fOverflow, "integer overflow"); return ret;}Int2 CObjectIStream::ReadInt2(void){ Int4 data = ReadInt4(); Int2 ret = Int2(data); if ( ret != data ) ThrowError(fOverflow, "integer overflow"); return ret;}Uint2 CObjectIStream::ReadUint2(void){ Uint4 data = ReadUint4(); Uint2 ret = Uint2(data); if ( ret != data ) ThrowError(fOverflow, "integer overflow"); return ret;}Int4 CObjectIStream::ReadInt4(void){ Int8 data = ReadInt8(); Int4 ret = Int4(data); if ( ret != data ) ThrowError(fOverflow, "integer overflow"); return ret;}Uint4 CObjectIStream::ReadUint4(void){ Uint8 data = ReadUint8(); Uint4 ret = Uint4(data); if ( ret != data ) ThrowError(fOverflow, "integer overflow"); return ret;}float CObjectIStream::ReadFloat(void){ double data = ReadDouble();#if defined(FLT_MIN) && defined(FLT_MAX) if ( data < FLT_MIN || data > FLT_MAX ) ThrowError(fOverflow, "float overflow");#endif return float(data);}#if SIZEOF_LONG_DOUBLE != 0long double CObjectIStream::ReadLDouble(void){ return ReadDouble();}#endifchar* CObjectIStream::ReadCString(void){ string s; ReadString(s); return strdup(s.c_str());}void CObjectIStream::ReadStringStore(string& s){ ReadString(s);}void CObjectIStream::ReadString(string& s, CPackString& pack_string, EStringType type){ ReadString(s); pack_string.Pack(s);}void CObjectIStream::SkipInt1(void){ SkipSNumber();}void CObjectIStream::SkipUint1(void){ SkipUNumber();}void CObjectIStream::SkipInt2(void){ SkipSNumber();}void CObjectIStream::SkipUint2(void){ SkipUNumber();}void CObjectIStream::SkipInt4(void){ SkipSNumber();}void CObjectIStream::SkipUint4(void){ SkipUNumber();}void CObjectIStream::SkipInt8(void){ SkipSNumber();}void CObjectIStream::SkipUint8(void){ SkipUNumber();}void CObjectIStream::SkipFloat(void){ SkipFNumber();}void CObjectIStream::SkipDouble(void){ SkipFNumber();}#if SIZEOF_LONG_DOUBLE != 0void CObjectIStream::SkipLDouble(void){ SkipFNumber();}#endifvoid CObjectIStream::SkipCString(void){ SkipString();}void CObjectIStream::SkipStringStore(void){ SkipString();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -