⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objostrasnb.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
            // full length            length = sizeof(data);        }    }    out.WriteShortLength(length);    WriteBytesOf(out, data, length);}void CObjectOStreamAsnBinary::WriteBool(bool data){    WriteSysTag(eBoolean);    WriteShortLength(1);    WriteByte(data);}void CObjectOStreamAsnBinary::WriteChar(char data){    WriteSysTag(eGeneralString);    WriteShortLength(1);    WriteByte(data);}void CObjectOStreamAsnBinary::WriteInt4(Int4 data){    WriteSysTag(eInteger);    WriteNumberValue(*this, data);}void CObjectOStreamAsnBinary::WriteUint4(Uint4 data){    WriteSysTag(eInteger);    WriteNumberValue(*this, data);}void CObjectOStreamAsnBinary::WriteInt8(Int8 data){    WriteSysTag(eInteger);    WriteNumberValue(*this, data);}void CObjectOStreamAsnBinary::WriteUint8(Uint8 data){    WriteSysTag(eInteger);    WriteNumberValue(*this, data);}static const size_t kMaxDoubleLength = 64;void CObjectOStreamAsnBinary::WriteDouble2(double data, size_t digits){    if (isnan(data)) {        ThrowError(fInvalidData, "invalid double: not a number");    }    if (!finite(data)) {        ThrowError(fInvalidData, "invalid double: infinite");    }    int shift = int(ceil(log10(fabs(data))));    int precision = int(digits - shift);    if ( precision < 0 )        precision = 0;    else if ( size_t(precision) > kMaxDoubleLength ) // limit precision of data        precision = int(kMaxDoubleLength);    // ensure buffer is large enough to fit result    // (additional bytes are for sign, dot and exponent)    char buffer[kMaxDoubleLength + 16];    int width = sprintf(buffer, "%.*g", precision, data);    if ( width <= 0 || width >= int(sizeof(buffer) - 1) )        ThrowError(fOverflow, "buffer overflow");    _ASSERT(strlen(buffer) == size_t(width));    WriteSysTag(eReal);    WriteLength(width + 1);    WriteByte(eDecimal);    WriteBytes(buffer, width);}void CObjectOStreamAsnBinary::WriteDouble(double data){    WriteDouble2(data, DBL_DIG);}void CObjectOStreamAsnBinary::WriteFloat(float data){    WriteDouble2(data, FLT_DIG);}void CObjectOStreamAsnBinary::WriteString(const string& str, EStringType type){    size_t length = str.size();    WriteSysTag(eVisibleString);    WriteLength(length);    if ( type == eStringTypeVisible && m_FixMethod != eFNP_Allow ) {        size_t done = 0;        for ( size_t i = 0; i < length; ++i ) {            char c = str[i];            if ( !GoodVisibleChar(c) ) {                if ( i > done ) {                    WriteBytes(str.data() + done, i - done);                }                FixVisibleChar(c, m_FixMethod);                WriteByte(c);                done = i + 1;            }        }        if ( done < length ) {            WriteBytes(str.data() + done, length - done);        }    }    else {        WriteBytes(str.data(), length);    }}void CObjectOStreamAsnBinary::WriteStringStore(const string& str){    WriteShortTag(eApplication, false, eStringStore);    size_t length = str.size();    WriteLength(length);    WriteBytes(str.data(), length);}void CObjectOStreamAsnBinary::CopyStringValue(CObjectIStreamAsnBinary& in,                                              bool checkVisible){    size_t length = in.ReadLength();    WriteLength(length);    while ( length > 0 ) {        char buffer[1024];        size_t c = min(length, sizeof(buffer));        in.ReadBytes(buffer, c);        if ( checkVisible ) {            // Check the string for non-printable characters            for (size_t i = 0; i < c; i++) {                FixVisibleChar(buffer[i], m_FixMethod);            }        }        WriteBytes(buffer, c);        length -= c;    }    in.EndOfTag();}void CObjectOStreamAsnBinary::CopyString(CObjectIStream& in){    WriteSysTag(eVisibleString);    if ( in.GetDataFormat() == eSerial_AsnBinary ) {        CObjectIStreamAsnBinary& bIn =            *CTypeConverter<CObjectIStreamAsnBinary>::SafeCast(&in);        bIn.ExpectSysTag(eVisibleString);        CopyStringValue(bIn, true);    }    else {        string str;        in.ReadStd(str);        size_t length = str.size();        if ( m_FixMethod != eFNP_Allow ) {            // Check the string for non-printable characters            NON_CONST_ITERATE(string, i, str) {                FixVisibleChar(*i, m_FixMethod);            }        }        WriteLength(length);        WriteBytes(str.data(), length);    }}void CObjectOStreamAsnBinary::CopyStringStore(CObjectIStream& in){    WriteShortTag(eApplication, false, eStringStore);    if ( in.GetDataFormat() == eSerial_AsnBinary ) {        CObjectIStreamAsnBinary& bIn =            *CTypeConverter<CObjectIStreamAsnBinary>::SafeCast(&in);        bIn.ExpectSysTag(eApplication, false, eStringStore);        CopyStringValue(bIn);    }    else {        string str;        in.ReadStringStore(str);        size_t length = str.size();        WriteLength(length);        WriteBytes(str.data(), length);    }}void CObjectOStreamAsnBinary::WriteCString(const char* str){    if ( str == 0 ) {        WriteSysTag(eNull);        WriteShortLength(0);    }    else {        size_t length = strlen(str);        WriteSysTag(eVisibleString);        WriteLength(length);        if ( m_FixMethod != eFNP_Allow ) {            size_t done = 0;            for ( size_t i = 0; i < length; ++i ) {                char c = str[i];                if ( !GoodVisibleChar(c) ) {                    if ( i > done ) {                        WriteBytes(str + done, i - done);                    }                    FixVisibleChar(c, m_FixMethod);                    WriteByte(c);                    done = i + 1;                }            }            if ( done < length ) {                WriteBytes(str + done, length - done);            }        }        else {            WriteBytes(str, length);        }    }}void CObjectOStreamAsnBinary::WriteEnum(const CEnumeratedTypeValues& values,                                        TEnumValueType value){    if ( values.IsInteger() ) {        WriteSysTag(eInteger);    }    else {        values.FindName(value, false); // check value        WriteSysTag(eEnumerated);    }    WriteNumberValue(*this, value);}void CObjectOStreamAsnBinary::CopyEnum(const CEnumeratedTypeValues& values,                                       CObjectIStream& in){    TEnumValueType value = in.ReadEnum(values);    if ( values.IsInteger() )        WriteSysTag(eInteger);    else        WriteSysTag(eEnumerated);    WriteNumberValue(*this, value);}void CObjectOStreamAsnBinary::WriteObjectReference(TObjectIndex index){    WriteTag(eApplication, false, eObjectReference);    if ( sizeof(TObjectIndex) == sizeof(Int4) )        WriteNumberValue(*this, Int4(index));    else if ( sizeof(TObjectIndex) == sizeof(Int8) )        WriteNumberValue(*this, Int8(index));    else        ThrowError(fIllegalCall, "invalid size of TObjectIndex"            "must be either sizeof(Int4) or sizeof(Int4)");}void CObjectOStreamAsnBinary::WriteNullPointer(void){    WriteSysTag(eNull);    WriteShortLength(0);}void CObjectOStreamAsnBinary::WriteOtherBegin(TTypeInfo typeInfo){    WriteClassTag(typeInfo);    WriteIndefiniteLength();}void CObjectOStreamAsnBinary::WriteOtherEnd(TTypeInfo /*typeInfo*/){    WriteEndOfContent();}void CObjectOStreamAsnBinary::WriteOther(TConstObjectPtr object,                                         TTypeInfo typeInfo){    WriteClassTag(typeInfo);    WriteIndefiniteLength();    WriteObject(object, typeInfo);    WriteEndOfContent();}void CObjectOStreamAsnBinary::BeginContainer(const CContainerTypeInfo* containerType){    if ( containerType->RandomElementsOrder() )        WriteShortTag(eUniversal, true, eSet);    else        WriteShortTag(eUniversal, true, eSequence);    WriteIndefiniteLength();}void CObjectOStreamAsnBinary::EndContainer(void){    WriteEndOfContent();}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamAsnBinary::WriteContainer(const CContainerTypeInfo* cType,                                             TConstObjectPtr containerPtr){    if ( cType->RandomElementsOrder() )        WriteShortTag(eUniversal, true, eSet);    else        WriteShortTag(eUniversal, true, eSequence);    WriteIndefiniteLength();        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;                }            }            WriteObject(cType->GetElementPtr(i), elementType);        } while ( cType->NextElement(i) );        END_OBJECT_FRAME();    }    WriteEndOfContent();}void CObjectOStreamAsnBinary::CopyContainer(const CContainerTypeInfo* cType,                                            CObjectStreamCopier& copier){    BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameArray, cType);    copier.In().BeginContainer(cType);    if ( cType->RandomElementsOrder() )        WriteShortTag(eUniversal, true, eSet);    else        WriteShortTag(eUniversal, true, eSequence);    WriteIndefiniteLength();    TTypeInfo elementType = cType->GetElementType();    BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameArrayElement, elementType);    while ( copier.In().BeginContainerElement(elementType) ) {        CopyObject(elementType, copier);        copier.In().EndContainerElement();    }    END_OBJECT_2FRAMES_OF(copier);        WriteEndOfContent();    copier.In().EndContainer();    END_OBJECT_FRAME_OF(copier.In());}#endifvoid CObjectOStreamAsnBinary::BeginClass(const CClassTypeInfo* classType){    if ( classType->RandomOrder() )        WriteShortTag(eUniversal, true, eSet);    else        WriteShortTag(eUniversal, true, eSequence);    WriteIndefiniteLength();}void CObjectOStreamAsnBinary::EndClass(void){    WriteEndOfContent();}void CObjectOStreamAsnBinary::BeginClassMember(const CMemberId& id){    WriteTag(eContextSpecific, true, id.GetTag());    WriteIndefiniteLength();}void CObjectOStreamAsnBinary::EndClassMember(void){    WriteEndOfContent();}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamAsnBinary::WriteClass(const CClassTypeInfo* classType,                                         TConstObjectPtr classPtr){    if ( classType->RandomOrder() )        WriteShortTag(eUniversal, true, eSet);    else        WriteShortTag(eUniversal, true, eSequence);    WriteIndefiniteLength();        for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) {        classType->GetMemberInfo(i)->WriteMember(*this, classPtr);    }        WriteEndOfContent();}void CObjectOStreamAsnBinary::WriteClassMember(const CMemberId& memberId,                                               TTypeInfo memberType,                                               TConstObjectPtr memberPtr){    BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId);    WriteTag(eContextSpecific, true, memberId.GetTag());    WriteIndefiniteLength();        WriteObject(memberPtr, memberType);        WriteEndOfContent();    END_OBJECT_FRAME();}bool CObjectOStreamAsnBinary::WriteClassMember(const CMemberId& memberId,                                               const CDelayBuffer& buffer){    if ( !buffer.HaveFormat(eSerial_AsnBinary) )        return false;    BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId);    WriteTag(eContextSpecific, true, memberId.GetTag());    WriteIndefiniteLength();        Write(buffer.GetSource());        WriteEndOfContent();    END_OBJECT_FRAME();    return true;}void CObjectOStreamAsnBinary::CopyClassRandom(const CClassTypeInfo* classType,                                              CObjectStreamCopier& copier){    BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameClass, classType);    copier.In().BeginClass(classType);    if ( classType->RandomOrder() )        WriteShortTag(eUniversal, true, eSet);    else        WriteShortTag(eUniversal, true, eSequence);    WriteIndefiniteLength();    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;            WriteTag(eContextSpecific, true, memberInfo->GetId().GetTag());            WriteIndefiniteLength();            memberInfo->CopyMember(copier);            WriteEndOfContent();        }                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);        }    }    WriteEndOfContent();    copier.In().EndClass();    END_OBJECT_FRAME_OF(copier.In());}void CObjectOStreamAsnBinary::CopyClassSequential(const CClassTypeInfo* classType,                                                  CObjectStreamCopier& copier){    BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameClass, classType);    copier.In().BeginClass(classType);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -