📄 objostrasn.cpp
字号:
StartBlock();}void CObjectOStreamAsn::EndContainer(void){ EndBlock();}void CObjectOStreamAsn::BeginContainerElement(TTypeInfo /*elementType*/){ NextElement();}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamAsn::WriteContainer(const CContainerTypeInfo* cType, TConstObjectPtr containerPtr){ BEGIN_OBJECT_FRAME2(eFrameArray, cType); StartBlock(); CContainerTypeInfo::CConstIterator i; if ( cType->InitIterator(i, containerPtr) ) { TTypeInfo elementType = cType->GetElementType(); BEGIN_OBJECT_FRAME2(eFrameArrayElement, elementType); do { if (elementType->GetTypeFamily() == eTypeFamilyPointer) { const CPointerTypeInfo* pointerType = CTypeConverter<CPointerTypeInfo>::SafeCast(elementType); _ASSERT(pointerType->GetObjectPointer(cType->GetElementPtr(i))); if ( !pointerType->GetObjectPointer(cType->GetElementPtr(i)) ) { ERR_POST(Warning << " NULL pointer found in container: skipping"); continue; } } NextElement(); WriteObject(cType->GetElementPtr(i), elementType); } while ( cType->NextElement(i) ); END_OBJECT_FRAME(); } EndBlock(); END_OBJECT_FRAME();}void CObjectOStreamAsn::CopyContainer(const CContainerTypeInfo* cType, CObjectStreamCopier& copier){ BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameArray, cType); copier.In().BeginContainer(cType); StartBlock(); TTypeInfo elementType = cType->GetElementType(); BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameArrayElement, elementType); while ( copier.In().BeginContainerElement(elementType) ) { NextElement(); CopyObject(elementType, copier); copier.In().EndContainerElement(); } END_OBJECT_2FRAMES_OF(copier); EndBlock(); copier.In().EndContainer(); END_OBJECT_FRAME_OF(copier.In());}#endifvoid CObjectOStreamAsn::WriteMemberId(const CMemberId& id){ if ( !id.GetName().empty() ) { m_Output.PutString(id.GetName()); m_Output.PutChar(' '); } else if ( id.HaveExplicitTag() ) { m_Output.PutString("[" + NStr::IntToString(id.GetTag()) + "] "); }}void CObjectOStreamAsn::BeginClass(const CClassTypeInfo* /*classInfo*/){ StartBlock();}void CObjectOStreamAsn::EndClass(void){ EndBlock();}void CObjectOStreamAsn::BeginClassMember(const CMemberId& id){ NextElement(); WriteMemberId(id);}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamAsn::WriteClass(const CClassTypeInfo* classType, TConstObjectPtr classPtr){ StartBlock(); for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) { classType->GetMemberInfo(*i)->WriteMember(*this, classPtr); } EndBlock();}void CObjectOStreamAsn::WriteClassMember(const CMemberId& memberId, TTypeInfo memberType, TConstObjectPtr memberPtr){ NextElement(); BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId); WriteMemberId(memberId); WriteObject(memberPtr, memberType); END_OBJECT_FRAME();}bool CObjectOStreamAsn::WriteClassMember(const CMemberId& memberId, const CDelayBuffer& buffer){ if ( !buffer.HaveFormat(eSerial_AsnText) ) return false; NextElement(); BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId); WriteMemberId(memberId); Write(buffer.GetSource()); END_OBJECT_FRAME(); return true;}void CObjectOStreamAsn::CopyClassRandom(const CClassTypeInfo* classType, CObjectStreamCopier& copier){ BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameClass, classType); copier.In().BeginClass(classType); StartBlock(); 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()); if ( read[index] ) { copier.DuplicatedMember(memberInfo); } else { read[index] = true; NextElement(); WriteMemberId(memberInfo->GetId()); memberInfo->CopyMember(copier); } 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); } } EndBlock(); copier.In().EndClass(); END_OBJECT_FRAME_OF(copier.In());}void CObjectOStreamAsn::CopyClassSequential(const CClassTypeInfo* classType, CObjectStreamCopier& copier){ BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameClass, classType); copier.In().BeginClass(classType); StartBlock(); 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()); for ( TMemberIndex i = *pos; i < index; ++i ) { // init missing member classType->GetMemberInfo(i)->CopyMissingMember(copier); } NextElement(); WriteMemberId(memberInfo->GetId()); memberInfo->CopyMember(copier); pos.SetIndex(index + 1); copier.In().EndClassMember(); } END_OBJECT_2FRAMES_OF(copier); // init all absent members for ( ; pos.Valid(); ++pos ) { classType->GetMemberInfo(*pos)->CopyMissingMember(copier); } EndBlock(); copier.In().EndClass(); END_OBJECT_FRAME_OF(copier.In());}#endifvoid CObjectOStreamAsn::BeginChoiceVariant(const CChoiceTypeInfo* , const CMemberId& id){ WriteMemberId(id);}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamAsn::WriteChoice(const CChoiceTypeInfo* choiceType, TConstObjectPtr choicePtr){ TMemberIndex index = choiceType->GetIndex(choicePtr); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); BEGIN_OBJECT_FRAME2(eFrameChoiceVariant, variantInfo->GetId()); WriteMemberId(variantInfo->GetId()); variantInfo->WriteVariant(*this, choicePtr); END_OBJECT_FRAME();}void CObjectOStreamAsn::CopyChoice(const CChoiceTypeInfo* choiceType, CObjectStreamCopier& copier){ BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameChoice, 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); copier.In().SetTopMemberId(variantInfo->GetId()); copier.Out().SetTopMemberId(variantInfo->GetId()); WriteMemberId(variantInfo->GetId()); variantInfo->CopyVariant(copier); copier.In().EndChoiceVariant(); END_OBJECT_2FRAMES_OF(copier); copier.In().EndChoice(); END_OBJECT_FRAME_OF(copier.In());}#endifvoid CObjectOStreamAsn::BeginBytes(const ByteBlock& ){ m_Output.PutChar('\'');}static const char HEX[] = "0123456789ABCDEF";void CObjectOStreamAsn::WriteBytes(const ByteBlock& , const char* bytes, size_t length){ while ( length-- > 0 ) { char c = *bytes++; m_Output.WrapAt(78, false); m_Output.PutChar(HEX[(c >> 4) & 0xf]); m_Output.PutChar(HEX[c & 0xf]); }}void CObjectOStreamAsn::EndBytes(const ByteBlock& ){ m_Output.WrapAt(78, false); m_Output.PutString("\'H");}void CObjectOStreamAsn::BeginChars(const CharBlock& ){ m_Output.PutChar('"');}void CObjectOStreamAsn::WriteChars(const CharBlock& , const char* chars, size_t length){ while ( length > 0 ) { char c = *chars++; FixVisibleChar(c, m_FixMethod, m_Output.GetLine()); --length; m_Output.WrapAt(78, true); m_Output.PutChar(c); if ( c == '"' ) m_Output.PutChar('"'); }}void CObjectOStreamAsn::EndChars(const CharBlock& ){ m_Output.WrapAt(78, false); m_Output.PutChar('"');}void CObjectOStreamAsn::WriteSeparator(void){ m_Output.PutString(GetSeparator()); FlushBuffer();}END_NCBI_SCOPE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -