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

📄 classinfo.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
CClassTypeInfo* CClassTypeInfo::SetImplicit(void){    m_ClassType = eImplicit;    UpdateFunctions();    return this;}bool CClassTypeInfo::IsImplicitNonEmpty(void) const{    _ASSERT(Implicit());    return GetImplicitMember()->NonEmpty();}void CClassTypeInfo::AddSubClass(const CMemberId& id,                                 const CTypeRef& type){    TSubClasses* subclasses = m_SubClasses.get();    if ( !subclasses )        m_SubClasses.reset(subclasses = new TSubClasses);    subclasses->push_back(make_pair(id, type));}void CClassTypeInfo::AddSubClassNull(const CMemberId& id){    AddSubClass(id, CTypeRef(TTypeInfo(0)));}void CClassTypeInfo::AddSubClass(const char* id, TTypeInfoGetter getter){    AddSubClass(CMemberId(id), getter);}void CClassTypeInfo::AddSubClassNull(const char* id){    AddSubClassNull(CMemberId(id));}const CClassTypeInfo* CClassTypeInfo::GetParentClassInfo(void) const{    return m_ParentClassInfo;}void CClassTypeInfo::SetParentClass(TTypeInfo parentType){    if ( parentType->GetTypeFamily() != eTypeFamilyClass )        NCBI_THROW(CSerialException,eInvalidData,                   string("invalid parent class type: ") +                   parentType->GetName());    const CClassTypeInfo* parentClass =        CTypeConverter<CClassTypeInfo>::SafeCast(parentType);    _ASSERT(parentClass != 0);    _ASSERT(IsCObject() == parentClass->IsCObject());    _ASSERT(!m_ParentClassInfo);    m_ParentClassInfo = parentClass;    _ASSERT(GetMembers().Empty());    AddMember(NcbiEmptyString, 0, parentType)->SetParentClass();}TTypeInfo CClassTypeInfo::GetRealTypeInfo(TConstObjectPtr object) const{    if ( !m_SubClasses.get() ) {        // do not have subclasses -> real type is the same as our type        return this;    }    const type_info* ti = GetCPlusPlusTypeInfo(object);    if ( ti == 0 || ti == &GetId() )        return this;    RegisterSubClasses();    return GetClassInfoById(*ti);}void CClassTypeInfo::RegisterSubClasses(void) const{    const TSubClasses* subclasses = m_SubClasses.get();    if ( subclasses ) {        for ( TSubClasses::const_iterator i = subclasses->begin();              i != subclasses->end();              ++i ) {            TTypeInfo subClass = i->second.Get();            if ( subClass->GetTypeFamily() == eTypeFamilyClass ) {                CTypeConverter<CClassTypeInfo>::SafeCast(subClass)->RegisterSubClasses();            }        }    }}static inlineTObjectPtr GetMember(const CMemberInfo* memberInfo, TObjectPtr object){    if ( memberInfo->CanBeDelayed() )        memberInfo->GetDelayBuffer(object).Update();    return memberInfo->GetItemPtr(object);}static inlineTConstObjectPtr GetMember(const CMemberInfo* memberInfo,                          TConstObjectPtr object){    if ( memberInfo->CanBeDelayed() )        const_cast<CDelayBuffer&>(memberInfo->GetDelayBuffer(object)).Update();    return memberInfo->GetItemPtr(object);}void CClassTypeInfo::AssignMemberDefault(TObjectPtr object,                                         const CMemberInfo* info) const{    // check 'set' flag    bool haveSetFlag = info->HaveSetFlag();    if ( haveSetFlag && info->GetSetFlagNo(object) )        return; // member not set        TObjectPtr member = GetMember(info, object);    // assign member default    TTypeInfo memberType = info->GetTypeInfo();    TConstObjectPtr def = info->GetDefault();    if ( def == 0 ) {        if ( !memberType->IsDefault(member) )            memberType->SetDefault(member);    }    else {        memberType->Assign(member, def);    }    // update 'set' flag    if ( haveSetFlag )        info->UpdateSetFlagNo(object);}void CClassTypeInfo::AssignMemberDefault(TObjectPtr object,                                         TMemberIndex index) const{    AssignMemberDefault(object, GetMemberInfo(index));}const CMemberInfo* CClassTypeInfo::GetImplicitMember(void) const{    _ASSERT(GetMembers().FirstIndex() == GetMembers().LastIndex());    return GetMemberInfo(GetMembers().FirstIndex());}void CClassTypeInfo::UpdateFunctions(void){    switch ( m_ClassType ) {    case eSequential:        SetReadFunction(&ReadClassSequential);        SetWriteFunction(&WriteClassSequential);        SetCopyFunction(&CopyClassSequential);        SetSkipFunction(&SkipClassSequential);        break;    case eRandom:        SetReadFunction(&ReadClassRandom);        SetWriteFunction(&WriteClassRandom);        SetCopyFunction(&CopyClassRandom);        SetSkipFunction(&SkipClassRandom);        break;    case eImplicit:        SetReadFunction(&ReadImplicitMember);        SetWriteFunction(&WriteImplicitMember);        SetCopyFunction(&CopyImplicitMember);        SetSkipFunction(&SkipImplicitMember);        break;    }}void CClassTypeInfo::ReadClassSequential(CObjectIStream& in,                                         TTypeInfo objectType,                                         TObjectPtr objectPtr){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    in.ReadClassSequential(classType, objectPtr);}void CClassTypeInfo::ReadClassRandom(CObjectIStream& in,                                     TTypeInfo objectType,                                     TObjectPtr objectPtr){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    in.ReadClassRandom(classType, objectPtr);}void CClassTypeInfo::ReadImplicitMember(CObjectIStream& in,                                        TTypeInfo objectType,                                        TObjectPtr objectPtr){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    const CMemberInfo* memberInfo = classType->GetImplicitMember();    if( memberInfo->HaveSetFlag()) {        memberInfo->UpdateSetFlagYes(objectPtr);    }    in.ReadNamedType(classType,                     memberInfo->GetTypeInfo(),                     memberInfo->GetItemPtr(objectPtr));}void CClassTypeInfo::WriteClassRandom(CObjectOStream& out,                                      TTypeInfo objectType,                                      TConstObjectPtr objectPtr){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    out.WriteClassRandom(classType, objectPtr);}void CClassTypeInfo::WriteClassSequential(CObjectOStream& out,                                          TTypeInfo objectType,                                          TConstObjectPtr objectPtr){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    out.WriteClassSequential(classType, objectPtr);}void CClassTypeInfo::WriteImplicitMember(CObjectOStream& out,                                         TTypeInfo objectType,                                         TConstObjectPtr objectPtr){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    const CMemberInfo* memberInfo = classType->GetImplicitMember();    if (memberInfo->HaveSetFlag() && memberInfo->GetSetFlagNo(objectPtr)) {        if (memberInfo->Optional()) {            return;        }        if (memberInfo->NonEmpty() ||            memberInfo->GetTypeInfo()->GetTypeFamily() != eTypeFamilyContainer) {            ESerialVerifyData verify = out.GetVerifyData();            if (verify == eSerialVerifyData_Yes) {                out.ThrowError(CObjectOStream::fUnassigned,                    string("Unassigned member: ")+classType->GetName());            } else if (verify == eSerialVerifyData_No) {                return;            }        }     }    out.WriteNamedType(classType,                       memberInfo->GetTypeInfo(),                       memberInfo->GetItemPtr(objectPtr));}void CClassTypeInfo::CopyClassRandom(CObjectStreamCopier& copier,                                     TTypeInfo objectType){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    copier.CopyClassRandom(classType);}void CClassTypeInfo::CopyClassSequential(CObjectStreamCopier& copier,                                         TTypeInfo objectType){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    copier.CopyClassSequential(classType);}void CClassTypeInfo::CopyImplicitMember(CObjectStreamCopier& copier,                                        TTypeInfo objectType){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    const CMemberInfo* memberInfo = classType->GetImplicitMember();    copier.CopyNamedType(classType, memberInfo->GetTypeInfo());}void CClassTypeInfo::SkipClassRandom(CObjectIStream& in,                                     TTypeInfo objectType){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    in.SkipClassRandom(classType);}void CClassTypeInfo::SkipClassSequential(CObjectIStream& in,                                         TTypeInfo objectType){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    in.SkipClassSequential(classType);}void CClassTypeInfo::SkipImplicitMember(CObjectIStream& in,                                        TTypeInfo objectType){    const CClassTypeInfo* classType =        CTypeConverter<CClassTypeInfo>::SafeCast(objectType);    const CMemberInfo* memberInfo = classType->GetImplicitMember();    in.SkipNamedType(classType, memberInfo->GetTypeInfo());}bool CClassTypeInfo::IsDefault(TConstObjectPtr /*object*/) const{    return false;}void CClassTypeInfo::SetDefault(TObjectPtr dst) const{    for ( TMemberIndex i = GetMembers().FirstIndex(),              last = GetMembers().LastIndex();          i <= last; ++i ) {        AssignMemberDefault(dst, i);    }}bool CClassTypeInfo::Equals(TConstObjectPtr object1, TConstObjectPtr object2,                            ESerialRecursionMode how) const{    for ( TMemberIndex i = GetMembers().FirstIndex(),              last = GetMembers().LastIndex();          i <= last; ++i ) {        const CMemberInfo* info = GetMemberInfo(i);        if ( !info->GetTypeInfo()->Equals(GetMember(info, object1),                                          GetMember(info, object2), how) )            return false;        if ( info->HaveSetFlag() ) {            if ( !info->CompareSetFlags(object1,object2) )                return false;        }    }    // User defined comparison    if ( IsCObject() ) {        const CSerialUserOp* op1 =            dynamic_cast<const CSerialUserOp*>            (static_cast<const CObject*>(object1));        const CSerialUserOp* op2 =            dynamic_cast<const CSerialUserOp*>            (static_cast<const CObject*>(object2));        if ( op1  &&  op2 ) {            return op1->UserOp_Equals(*op2);        }    }    return true;}void CClassTypeInfo::Assign(TObjectPtr dst, TConstObjectPtr src,                            ESerialRecursionMode how) const{    for ( TMemberIndex i = GetMembers().FirstIndex(),              last = GetMembers().LastIndex();          i <= last; ++i ) {        const CMemberInfo* info = GetMemberInfo(i);        info->GetTypeInfo()->Assign(GetMember(info, dst),                                    GetMember(info, src), how);        if ( info->HaveSetFlag() ) {            info->UpdateSetFlag(dst,info->GetSetFlag(src));        }    }    // User defined assignment    if ( IsCObject() ) {        const CSerialUserOp* opsrc =            dynamic_cast<const CSerialUserOp*>            (static_cast<const CObject*>(src));        CSerialUserOp* opdst =            dynamic_cast<CSerialUserOp*>            (static_cast<CObject*>(dst));        if ( opdst  &&  opsrc ) {            opdst->UserOp_Assign(*opsrc);        }    }}bool CClassTypeInfo::IsType(TTypeInfo typeInfo) const{    return typeInfo == this || typeInfo->IsParentClassOf(this);}bool CClassTypeInfo::IsParentClassOf(const CClassTypeInfo* typeInfo) const{    do {        typeInfo = typeInfo->m_ParentClassInfo;        if ( typeInfo == this )            return true;    } while ( typeInfo );    return false;}bool CClassTypeInfo::CalcMayContainType(TTypeInfo typeInfo) const{    const CClassTypeInfoBase* parentClass = m_ParentClassInfo;    return parentClass && parentClass->MayContainType(typeInfo) ||        CParent::CalcMayContainType(typeInfo);}END_NCBI_SCOPE

⌨️ 快捷键说明

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