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

📄 asntypes.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    typedef CContainerTypeInfo::CConstIterator TIterator;     static const CSequenceOfTypeInfo* GetType(const TIterator& iter)        {            return CTypeConverter<CSequenceOfTypeInfo>::SafeCast(iter.GetContainerType());        }    static bool InitIterator(TIterator& iter)        {            TObjectPtr nodePtr =                GetType(iter)->FirstNode(iter.GetContainerPtr());            iter.m_IteratorData = nodePtr;            return nodePtr != 0;        }    static void ReleaseIterator(TIterator& )        {        }    static void CopyIterator(TIterator& dst,                             const TIterator& src)        {            dst.m_IteratorData = src.m_IteratorData;        }    static bool NextElement(TIterator& iter)        {            TObjectPtr nodePtr = GetType(iter)->NextNode(iter.m_IteratorData);            iter.m_IteratorData = nodePtr;            return nodePtr != 0;        }    static TConstObjectPtr GetElementPtr(const TIterator& iter)        {            return GetType(iter)->Data(iter.m_IteratorData);        }};class CSequenceOfTypeInfoFunctionsI{public:    typedef CContainerTypeInfo::CIterator TIterator;     static const CSequenceOfTypeInfo* GetType(const TIterator& iter)        {            return CTypeConverter<CSequenceOfTypeInfo>::SafeCast(iter.GetContainerType());        }    static bool InitIterator(TIterator& iter)        {            TObjectPtr* nodePtrPtr =                &GetType(iter)->FirstNode(iter.GetContainerPtr());            iter.m_IteratorData = nodePtrPtr;            return *nodePtrPtr != 0;        }    static void ReleaseIterator(TIterator& )        {        }    static void CopyIterator(TIterator& dst, const TIterator& src)        {            dst.m_IteratorData = src.m_IteratorData;        }    static bool NextElement(TIterator& iter)        {            TObjectPtr* nodePtrPtr =                &GetType(iter)->NextNode(*(TObjectPtr*)iter.m_IteratorData);            iter.m_IteratorData = nodePtrPtr;            return *nodePtrPtr != 0;        }    static TObjectPtr GetElementPtr(const TIterator& iter)        {            return GetType(iter)->Data(*(TObjectPtr*)iter.m_IteratorData);        }    static bool EraseElement(TIterator& iter)        {            const CSequenceOfTypeInfo* type = GetType(iter);            TObjectPtr* nodePtrPtr = (TObjectPtr*)iter.m_IteratorData;            TObjectPtr nodePtr = *nodePtrPtr;            TObjectPtr nextNodePtr = type->NextNode(nodePtr);            *nodePtrPtr = nextNodePtr;            type->DeleteNode(nodePtr);            return nextNodePtr != 0;        }    static void EraseAllElements(TIterator& iter)        {            const CSequenceOfTypeInfo* type = GetType(iter);            TObjectPtr* nodePtrPtr = (TObjectPtr*)iter.m_IteratorData;            TObjectPtr nodePtr = *nodePtrPtr;            *nodePtrPtr = 0;            while ( nodePtr ) {                TObjectPtr nextNodePtr = type->NextNode(nodePtr);                type->DeleteNode(nodePtr);                nodePtr = nextNodePtr;            }        }};class CSequenceOfTypeInfoFunctions{public:    static void ReadSequence(CObjectIStream& in,                             TTypeInfo containerType,                             TObjectPtr containerPtr)        {            const CSequenceOfTypeInfo* seqType =                CTypeConverter<CSequenceOfTypeInfo>::SafeCast(containerType);            BEGIN_OBJECT_FRAME_OF2(in, eFrameArray, seqType);            in.BeginContainer(seqType);            TTypeInfo elementType = seqType->GetElementType();            BEGIN_OBJECT_FRAME_OF2(in, eFrameArrayElement, elementType);            TObjectPtr* nextNodePtr = &seqType->FirstNode(containerPtr);            while ( in.BeginContainerElement(elementType) ) {                // get current node pointer                TObjectPtr node = *nextNodePtr;                        // create node                _ASSERT(!node);                node = *nextNodePtr = seqType->CreateNode();                // read node data                in.ReadObject(seqType->Data(node), elementType);                // save next node for next read                nextNodePtr = &seqType->NextNode(node);                        in.EndContainerElement();            }            END_OBJECT_FRAME_OF(in);            in.EndContainer();            END_OBJECT_FRAME_OF(in);        }};void CSequenceOfTypeInfo::InitSequenceOfTypeInfo(void){    TTypeInfo type = GetElementType();    const CAutoPointerTypeInfo* ptrInfo =        dynamic_cast<const CAutoPointerTypeInfo*>(type);    if ( ptrInfo != 0 ) {        // data type is auto_ptr        TTypeInfo asnType = ptrInfo->GetPointedType();        if ( asnType->GetTypeFamily() == eTypeFamilyChoice ) {            // CHOICE            SetChoiceNext();            m_ElementType = asnType;        }        else if ( asnType->GetTypeFamily() == eTypeFamilyClass ) {            // user types            const CClassTypeInfo* classType =                CTypeConverter<CClassTypeInfo>::SafeCast(asnType);            if ( GetFirstItemOffset(classType->GetItems()) < sizeof(void*) ) {                CNcbiOstrstream msg;                msg << "CSequenceOfTypeInfo: incompatible type: " <<                    type->GetName() << ": " << typeid(*type).name() <<                    " size: " << type->GetSize();                NCBI_THROW(CSerialException,eInvalidData, CNcbiOstrstreamToString(msg));            }            m_NextOffset = 0;            m_DataOffset = 0;            m_ElementType = asnType;        }        else if ( asnType->GetSize() <= sizeof(dataval) ) {            // standard types and SET/SEQUENCE OF            SetValNodeNext();            m_ElementType = asnType;        }        else {/*            _ASSERT(type->GetSize() <= sizeof(dataval));            SetValNodeNext();*/            CNcbiOstrstream msg;            msg << "CSequenceOfTypeInfo: incompatible type: " <<                type->GetName() << ": " << typeid(*type).name() <<                " size: " << type->GetSize();            NCBI_THROW(CSerialException,eInvalidData, CNcbiOstrstreamToString(msg));        }    }    else if ( type->GetSize() <= sizeof(dataval) ) {        // SEQUENCE OF, SET OF or primitive types        SetValNodeNext();    }    else {        CNcbiOstrstream msg;        msg << "CSequenceOfTypeInfo: incompatible type: " <<            type->GetName() << ": " << typeid(*type).name() <<            " size: " << type->GetSize();        NCBI_THROW(CSerialException,eInvalidData, CNcbiOstrstreamToString(msg));    }    {        typedef CSequenceOfTypeInfoFunctions TFunc;        SetReadFunction(&TFunc::ReadSequence);    }    {        typedef CSequenceOfTypeInfoFunctionsCI TFunc;        SetConstIteratorFunctions(&TFunc::InitIterator, &TFunc::ReleaseIterator,                                  &TFunc::CopyIterator, &TFunc::NextElement,                                  &TFunc::GetElementPtr);    }    {        typedef CSequenceOfTypeInfoFunctionsI TFunc;        SetIteratorFunctions(&TFunc::InitIterator, &TFunc::ReleaseIterator,                             &TFunc::CopyIterator, &TFunc::NextElement,                             &TFunc::GetElementPtr,                             &TFunc::EraseElement, &TFunc::EraseAllElements);    }}void CSequenceOfTypeInfo::SetChoiceNext(void){    m_NextOffset = offsetof(valnode, next);    m_DataOffset = 0;}void CSequenceOfTypeInfo::SetValNodeNext(void){    m_NextOffset = offsetof(valnode, next);    m_DataOffset = offsetof(valnode, data);}TObjectPtr CSequenceOfTypeInfo::CreateNode(void) const{    if ( m_DataOffset == 0 ) {        _ASSERT(m_NextOffset == 0 || m_NextOffset == offsetof(valnode, next));        return GetElementType()->Create();    }    else {        _ASSERT(m_NextOffset == offsetof(valnode, next));        _ASSERT(m_DataOffset == offsetof(valnode, data));        return Alloc(sizeof(valnode));    }}void CSequenceOfTypeInfo::DeleteNode(TObjectPtr node) const{    if ( m_DataOffset == 0 ) {        _ASSERT(m_NextOffset == 0 || m_NextOffset == offsetof(valnode, next));        GetElementType()->Delete(node);    }    else {        _ASSERT(m_NextOffset == offsetof(valnode, next));        _ASSERT(m_DataOffset == offsetof(valnode, data));        Free(node);    }}bool CSequenceOfTypeInfo::IsDefault(TConstObjectPtr object) const{    return FirstNode(object) == 0;}void CSequenceOfTypeInfo::SetDefault(TObjectPtr dst) const{    FirstNode(dst) = 0;}void CSequenceOfTypeInfo::Assign(TObjectPtr dst, TConstObjectPtr src,                                 ESerialRecursionMode how) const{    src = FirstNode(src);    if ( src == 0 ) {        FirstNode(dst) = 0;        return;    }    TTypeInfo dataType = GetElementType();    dst = FirstNode(dst) = CreateNode();    dataType->Assign(Data(dst), Data(src), how);    while ( (src = NextNode(src)) != 0 ) {        dst = NextNode(dst) = CreateNode();        dataType->Assign(Data(dst), Data(src), how);    }}static CTypeInfoMap s_SetOfTypeInfo_map;TTypeInfo CSetOfTypeInfo::GetTypeInfo(TTypeInfo base){    return s_SetOfTypeInfo_map.GetTypeInfo(base, &CreateTypeInfo);}CTypeInfo* CSetOfTypeInfo::CreateTypeInfo(TTypeInfo base){    return new CSetOfTypeInfo(base);}CSetOfTypeInfo::CSetOfTypeInfo(TTypeInfo type)    : CParent(type, true){}CSetOfTypeInfo::CSetOfTypeInfo(const char* name, TTypeInfo type)    : CParent(name, type, true){}CSetOfTypeInfo::CSetOfTypeInfo(const string& name, TTypeInfo type)    : CParent(name, type, true){}COctetStringTypeInfo::COctetStringTypeInfo(void)    : CParent(sizeof(TObjectType), ePrimitiveValueOctetString){    SetReadFunction(&ReadOctetString);    SetWriteFunction(&WriteOctetString);    SetCopyFunction(&CopyOctetString);    SetSkipFunction(&SkipOctetString);}bool COctetStringTypeInfo::IsDefault(TConstObjectPtr object) const{    return Get(object)->totlen == 0;}bool COctetStringTypeInfo::Equals(TConstObjectPtr obj1, TConstObjectPtr obj2,                                  ESerialRecursionMode) const{    bytestore* bs1 = Get(obj1);    bytestore* bs2 = Get(obj2);    if ( bs1 == 0 || bs2 == 0 )        return bs1 == bs2;    Int4 len = BSLen(bs1);    if ( len != BSLen(bs2) )        return false;        BSSeek(bs1, 0, SEEK_SET);    BSSeek(bs2, 0, SEEK_SET);    char buff1[1024], buff2[1024];    while ( len > 0 ) {        Int4 chunk = Int4(sizeof(buff1));        if ( chunk > len )            chunk = len;        BSRead(bs1, buff1, chunk);        BSRead(bs2, buff2, chunk);        if ( memcmp(buff1, buff2, chunk) != 0 )            return false;        len -= chunk;    }    return true;}void COctetStringTypeInfo::SetDefault(TObjectPtr dst) const{    BSFree(Get(dst));    Get(dst) = BSNew(0);}void COctetStringTypeInfo::Assign(TObjectPtr dst, TConstObjectPtr src,                                  ESerialRecursionMode) const{    if ( Get(src) == 0 ) {        NCBI_THROW(CSerialException,eInvalidData, "null bytestore pointer");    }    BSFree(Get(dst));    Get(dst) = BSDup(Get(src));}void COctetStringTypeInfo::ReadOctetString(CObjectIStream& in,                                           TTypeInfo /*objectType*/,                                           TObjectPtr objectPtr){    CObjectIStream::ByteBlock block(in);    BSFree(Get(objectPtr));    char buffer[1024];    Int4 count = Int4(block.Read(buffer, sizeof(buffer)));    bytestore* bs = Get(objectPtr) = BSNew(count);    BSWrite(bs, buffer, count);    while ( (count = Int4(block.Read(buffer, sizeof(buffer)))) != 0 ) {        BSWrite(bs, buffer, count);    }    block.End();}

⌨️ 快捷键说明

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