📄 objostr.cpp
字号:
BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo); WriteFileHeader(typeInfo); WriteObject(object, typeInfo); EndOfWrite(); END_OBJECT_FRAME(); if ( GetAutoSeparator() ) Separator(*this);}void CObjectOStream::Write(TConstObjectPtr object, const CTypeRef& type){ Write(object, type.Get());}void CObjectOStream::RegisterObject(TTypeInfo typeInfo){ if ( m_Objects ) m_Objects->RegisterObject(typeInfo);}void CObjectOStream::RegisterObject(TConstObjectPtr object, TTypeInfo typeInfo){ if ( m_Objects ) m_Objects->RegisterObject(object, typeInfo);}void CObjectOStream::WriteSeparateObject(const CConstObjectInfo& object){ if ( m_Objects ) { size_t firstObject = m_Objects->GetObjectCount(); WriteObject(object); size_t lastObject = m_Objects->GetObjectCount(); m_Objects->ForgetObjects(firstObject, lastObject); } else { WriteObject(object); }}void CObjectOStream::WriteExternalObject(TConstObjectPtr objectPtr, TTypeInfo typeInfo){ _TRACE("CObjectOStream::WriteExternalObject(" << NStr::PtrToString(objectPtr) << ", " << typeInfo->GetName() << ')'); RegisterObject(objectPtr, typeInfo); WriteObject(objectPtr, typeInfo);}bool CObjectOStream::Write(CByteSource& source){ m_Output.Write(*source.Open()); return true;}void CObjectOStream::WriteFileHeader(TTypeInfo /*type*/){ // do nothing by default}void CObjectOStream::WritePointer(TConstObjectPtr objectPtr, TTypeInfo declaredTypeInfo){ _TRACE("WritePointer("<<NStr::PtrToString(objectPtr)<<", " <<declaredTypeInfo->GetName()<<")"); if ( objectPtr == 0 ) { _TRACE("WritePointer: "<<NStr::PtrToString(objectPtr)<<": null"); WriteNullPointer(); return; } TTypeInfo realTypeInfo = declaredTypeInfo->GetRealTypeInfo(objectPtr); if ( m_Objects ) { const CWriteObjectInfo* info = m_Objects->RegisterObject(objectPtr, realTypeInfo); if ( info ) { // old object WriteObjectReference(info->GetIndex()); return; } } if ( declaredTypeInfo == realTypeInfo ) { _TRACE("WritePointer: "<<NStr::PtrToString(objectPtr)<<": new"); WriteThis(objectPtr, realTypeInfo); } else { _TRACE("WritePointer: "<<NStr::PtrToString(objectPtr)<< ": new "<<realTypeInfo->GetName()); WriteOther(objectPtr, realTypeInfo); }}void CObjectOStream::WriteThis(TConstObjectPtr object, TTypeInfo typeInfo){ WriteObject(object, typeInfo);}void CObjectOStream::WriteFloat(float data){ WriteDouble(data);}#if SIZEOF_LONG_DOUBLE != 0void CObjectOStream::WriteLDouble(long double data){ WriteDouble(data);}#endifvoid CObjectOStream::BeginNamedType(TTypeInfo /*namedTypeInfo*/){}void CObjectOStream::EndNamedType(void){}void CObjectOStream::WriteNamedType(TTypeInfo#ifndef VIRTUAL_MID_LEVEL_IO namedTypeInfo#endif , TTypeInfo objectType, TConstObjectPtr objectPtr){#ifndef VIRTUAL_MID_LEVEL_IO BEGIN_OBJECT_FRAME2(eFrameNamed, namedTypeInfo); BeginNamedType(namedTypeInfo);#endif WriteObject(objectPtr, objectType);#ifndef VIRTUAL_MID_LEVEL_IO EndNamedType(); END_OBJECT_FRAME();#endif}void CObjectOStream::CopyNamedType(TTypeInfo namedTypeInfo, TTypeInfo objectType, CObjectStreamCopier& copier){#ifndef VIRTUAL_MID_LEVEL_IO BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameNamed, namedTypeInfo); copier.In().BeginNamedType(namedTypeInfo); BeginNamedType(namedTypeInfo); CopyObject(objectType, copier); EndNamedType(); copier.In().EndNamedType(); END_OBJECT_2FRAMES_OF(copier);#else BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameNamed, namedTypeInfo); copier.In().BeginNamedType(namedTypeInfo); CopyObject(objectType, copier); copier.In().EndNamedType(); END_OBJECT_FRAME_OF(copier.In());#endif}void CObjectOStream::WriteOther(TConstObjectPtr object, TTypeInfo typeInfo){ WriteOtherBegin(typeInfo); WriteObject(object, typeInfo); WriteOtherEnd(typeInfo);}void CObjectOStream::WriteOtherEnd(TTypeInfo /*typeInfo*/){}void CObjectOStream::EndContainer(void){}void CObjectOStream::BeginContainerElement(TTypeInfo /*elementType*/){}void CObjectOStream::EndContainerElement(void){}void CObjectOStream::WriteContainer(const CContainerTypeInfo* cType, TConstObjectPtr containerPtr){ BEGIN_OBJECT_FRAME2(eFrameArray, cType); BeginContainer(cType); CContainerTypeInfo::CConstIterator i; if ( cType->InitIterator(i, containerPtr) ) { TTypeInfo elementType = cType->GetElementType(); BEGIN_OBJECT_FRAME2(eFrameArrayElement, elementType); do { BeginContainerElement(elementType); WriteObject(cType->GetElementPtr(i), elementType); EndContainerElement(); } while ( cType->NextElement(i) ); END_OBJECT_FRAME(); } EndContainer(); END_OBJECT_FRAME();}void CObjectOStream::WriteContainerElement(const CConstObjectInfo& element){ BeginContainerElement(element.GetTypeInfo()); WriteObject(element); EndContainerElement();}void CObjectOStream::CopyContainer(const CContainerTypeInfo* cType, CObjectStreamCopier& copier){ BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameArray, cType); copier.In().BeginContainer(cType); BeginContainer(cType); TTypeInfo elementType = cType->GetElementType(); BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameArrayElement, elementType); while ( copier.In().BeginContainerElement(elementType) ) { BeginContainerElement(elementType); CopyObject(elementType, copier); EndContainerElement(); copier.In().EndContainerElement(); } END_OBJECT_2FRAMES_OF(copier); EndContainer(); copier.In().EndContainer(); END_OBJECT_2FRAMES_OF(copier);}void CObjectOStream::EndClass(void){}void CObjectOStream::EndClassMember(void){}void CObjectOStream::WriteClass(const CClassTypeInfo* classType, TConstObjectPtr classPtr){ BEGIN_OBJECT_FRAME2(eFrameClass, classType); BeginClass(classType); for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) { classType->GetMemberInfo(*i)->WriteMember(*this, classPtr); } EndClass(); END_OBJECT_FRAME();}void CObjectOStream::WriteClassMember(const CMemberId& memberId, TTypeInfo memberType, TConstObjectPtr memberPtr){ BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId); BeginClassMember(memberId); WriteObject(memberPtr, memberType); EndClassMember(); END_OBJECT_FRAME();}bool CObjectOStream::WriteClassMember(const CMemberId& memberId, const CDelayBuffer& buffer){ if ( !buffer.HaveFormat(GetDataFormat()) ) return false; BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId); BeginClassMember(memberId); Write(buffer.GetSource()); EndClassMember(); END_OBJECT_FRAME(); return true;}void CObjectOStream::CopyClassRandom(const CClassTypeInfo* classType, CObjectStreamCopier& copier){ BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameClass, classType); copier.In().BeginClass(classType); BeginClass(classType); vector<bool> read(classType->GetMembers().LastIndex() + 1); BEGIN_OBJECT_2FRAMES_OF(copier, eFrameClassMember); TMemberIndex index; while ( (index = copier.In().BeginClassMember(classType)) != kInvalidMember ) { const CMemberInfo* memberInfo = classType->GetMemberInfo(index); copier.In().SetTopMemberId(memberInfo->GetId()); SetTopMemberId(memberInfo->GetId()); copier.SetPathHooks(*this, true); if ( read[index] ) { copier.In().DuplicatedMember(memberInfo); } else { read[index] = true; BeginClassMember(memberInfo->GetId()); memberInfo->CopyMember(copier); EndClassMember(); } copier.SetPathHooks(*this, false); copier.In().EndClassMember(); } END_OBJECT_2FRAMES_OF(copier); // init all absent members for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) { if ( !read[*i] ) { classType->GetMemberInfo(*i)->CopyMissingMember(copier); } } EndClass(); copier.In().EndClass(); END_OBJECT_2FRAMES_OF(copier);}void CObjectOStream::CopyClassSequential(const CClassTypeInfo* classType, CObjectStreamCopier& copier){ BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameClass, classType); copier.In().BeginClass(classType); BeginClass(classType); CClassTypeInfo::CIterator pos(classType); BEGIN_OBJECT_2FRAMES_OF(copier, eFrameClassMember); TMemberIndex index; while ( (index = copier.In().BeginClassMember(classType, *pos)) != kInvalidMember ) { const CMemberInfo* memberInfo = classType->GetMemberInfo(index); copier.In().SetTopMemberId(memberInfo->GetId()); SetTopMemberId(memberInfo->GetId()); copier.SetPathHooks(*this, true); for ( TMemberIndex i = *pos; i < index; ++i ) { // init missing member classType->GetMemberInfo(i)->CopyMissingMember(copier); } BeginClassMember(memberInfo->GetId()); memberInfo->CopyMember(copier); pos.SetIndex(index + 1); EndClassMember(); copier.SetPathHooks(*this, false); copier.In().EndClassMember(); } END_OBJECT_2FRAMES_OF(copier); // init all absent members for ( ; pos.Valid(); ++pos ) { classType->GetMemberInfo(*pos)->CopyMissingMember(copier); } EndClass(); copier.In().EndClass(); END_OBJECT_2FRAMES_OF(copier);}void CObjectOStream::BeginChoice(const CChoiceTypeInfo* /*choiceType*/){}void CObjectOStream::EndChoice(void){}void CObjectOStream::EndChoiceVariant(void){}void CObjectOStream::WriteChoice(const CChoiceTypeInfo* choiceType, TConstObjectPtr choicePtr){ BEGIN_OBJECT_FRAME2(eFrameChoice, choiceType); BeginChoice(choiceType); TMemberIndex index = choiceType->GetIndex(choicePtr); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); BEGIN_OBJECT_FRAME2(eFrameChoiceVariant, variantInfo->GetId()); BeginChoiceVariant(choiceType, variantInfo->GetId()); variantInfo->WriteVariant(*this, choicePtr); EndChoiceVariant(); END_OBJECT_FRAME(); EndChoice(); END_OBJECT_FRAME();}void CObjectOStream::CopyChoice(const CChoiceTypeInfo* choiceType, CObjectStreamCopier& copier){ BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameChoice, choiceType); BeginChoice(choiceType); copier.In().BeginChoice(choiceType); BEGIN_OBJECT_2FRAMES_OF(copier, eFrameChoiceVariant); TMemberIndex index = copier.In().BeginChoiceVariant(choiceType); if ( index == kInvalidMember ) { copier.ThrowError(CObjectIStream::fFormatError, "choice variant id expected"); } const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); if (variantInfo->GetId().IsAttlist()) { const CMemberInfo* memberInfo = dynamic_cast<const CMemberInfo*>( choiceType->GetVariants().GetItemInfo(index)); BeginClassMember(memberInfo->GetId()); memberInfo->CopyMember(copier); EndClassMember(); index = copier.In().BeginChoiceVariant(choiceType); if ( index == kInvalidMember ) copier.ThrowError(CObjectIStream::fFormatError, "choice variant id expected"); variantInfo = choiceType->GetVariantInfo(index); } copier.In().SetTopMemberId(variantInfo->GetId()); copier.Out().SetTopMemberId(variantInfo->GetId()); copier.SetPathHooks(copier.Out(), true);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -