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

📄 stltypes.hpp

📁 ncbi源码
💻 HPP
📖 第 1 页 / 共 3 页
字号:
    static void AddElementIn(const CContainerTypeInfo* containerType,                             TObjectPtr containerPtr, CObjectIStream& in)        {            TElementType data;            containerType->GetElementType()->ReadData(in, &data);            InsertElement(containerPtr, data);        }    static void SetAddElementFunctions(CStlOneArgTemplate* info)        {            info->SetAddElementFunctions(&AddElement, &AddElementIn);        }};template<class Container, class StlIterator,    typename ContainerPtr, typename ElementRef,    class TypeInfoIterator>class CStlClassInfoFunctionsIBase :    public CStlClassInfoFunctions<Container>{public:    typedef StlIterator TStlIterator;    typedef TypeInfoIterator TTypeInfoIterator;    typedef typename TTypeInfoIterator::TObjectPtr TObjectPtr;    static TStlIterator& It(TTypeInfoIterator& iter)        {            if ( sizeof(TStlIterator) <= sizeof(iter.m_IteratorData) ) {                void* data = &iter.m_IteratorData;                return *static_cast<TStlIterator*>(data);            }            else {                void* data = iter.m_IteratorData;                return *static_cast<TStlIterator*>(data);            }        }    static const TStlIterator& It(const TTypeInfoIterator& iter)        {            if ( sizeof(TStlIterator) <= sizeof(iter.m_IteratorData) ) {                const void* data = &iter.m_IteratorData;                return *static_cast<const TStlIterator*>(data);            }            else {                const void* data = iter.m_IteratorData;                return *static_cast<const TStlIterator*>(data);            }        }    static bool InitIterator(TTypeInfoIterator& iter)        {            TStlIterator stl_iter = Get(iter.GetContainerPtr()).begin();            if ( sizeof(TStlIterator) <= sizeof(iter.m_IteratorData) ) {                void* data = &iter.m_IteratorData;                new (data) TStlIterator(stl_iter);            }            else {                iter.m_IteratorData = new TStlIterator(stl_iter);            }            return stl_iter != Get(iter.GetContainerPtr()).end();        }    static void ReleaseIterator(TTypeInfoIterator& iter)        {            if ( sizeof(TStlIterator) <= sizeof(iter.m_IteratorData) ) {                void* data = &iter.m_IteratorData;                static_cast<TStlIterator*>(data)->~StlIterator();            }            else {                void* data = iter.m_IteratorData;                delete static_cast<TStlIterator*>(data);            }        }    static void CopyIterator(TTypeInfoIterator& dst,                             const TTypeInfoIterator& src)        {            It(dst) = It(src);        }    static bool NextElement(TTypeInfoIterator& iter)        {            return ++It(iter) != Get(iter.GetContainerPtr()).end();        }    static TObjectPtr GetElementPtr(const TTypeInfoIterator& iter)        {            ElementRef e= *It(iter);            return &e;        }};template<class Container>class CStlClassInfoFunctionsCI :    public CStlClassInfoFunctionsIBase<Container, typename Container::const_iterator, const Container*, const typename Container::value_type&, CContainerTypeInfo::CConstIterator>{    typedef CStlClassInfoFunctionsIBase<Container, typename Container::const_iterator, const Container*, const typename Container::value_type&, CContainerTypeInfo::CConstIterator> CParent;public:    static void SetIteratorFunctions(CStlOneArgTemplate* info)        {            info->SetConstIteratorFunctions(&CParent::InitIterator,                                            &CParent::ReleaseIterator,                                            &CParent::CopyIterator,                                            &CParent::NextElement,                                            &CParent::GetElementPtr);        }};template<class Container>class CStlClassInfoFunctionsI :    public CStlClassInfoFunctionsIBase<Container, typename Container::iterator, Container*, typename Container::value_type&, CContainerTypeInfo::CIterator>{    typedef CStlClassInfoFunctionsIBase<Container, typename Container::iterator, Container*, typename Container::value_type&, CContainerTypeInfo::CIterator> CParent;public:    typedef typename CParent::TStlIterator TStlIterator;    typedef typename CParent::TTypeInfoIterator TTypeInfoIterator;    typedef typename CParent::TObjectPtr TObjectPtr;        static bool EraseElement(TTypeInfoIterator& iter)        {            TStlIterator& it = It(iter);            Container* c = static_cast<Container*>(iter.GetContainerPtr());            it = c->erase(it);            return it != c->end();        }    static void EraseAllElements(TTypeInfoIterator& iter)        {            Container* c = static_cast<Container*>(iter.GetContainerPtr());            c->erase(It(iter), c->end());        }    static void SetIteratorFunctions(CStlOneArgTemplate* info)        {            info->SetIteratorFunctions(&CParent::InitIterator,                                       &CParent::ReleaseIterator,                                       &CParent::CopyIterator,                                       &CParent::NextElement,                                       &CParent::GetElementPtr,                                       &EraseElement, &EraseAllElements);        }};template<class Container>class CStlClassInfoFunctionsI_set :    public CStlClassInfoFunctionsIBase<Container, typename Container::iterator, Container*, typename Container::value_type&, CContainerTypeInfo::CIterator>{    typedef CStlClassInfoFunctionsIBase<Container, typename Container::iterator, Container*, typename Container::value_type&, CContainerTypeInfo::CIterator> CParent;public:    typedef typename CParent::TStlIterator TStlIterator;    typedef typename CParent::TTypeInfoIterator TTypeInfoIterator;    typedef typename CParent::TObjectPtr TObjectPtr;        static TObjectPtr GetElementPtr(const TTypeInfoIterator& /*data*/)        {            CStlClassInfoUtil::CannotGetElementOfSet();            return 0;        }    static bool EraseElement(TTypeInfoIterator& iter)        {            TStlIterator& it = It(iter);            Container* c = static_cast<Container*>(iter.GetContainerPtr());            TStlIterator erase = it++;            c->erase(erase);            return it != c->end();        }    static void EraseAllElements(TTypeInfoIterator& iter)        {            Container* c = static_cast<Container*>(iter.GetContainerPtr());            c->erase(It(iter), c->end());        }    static void SetIteratorFunctions(CStlOneArgTemplate* info)        {            info->SetIteratorFunctions(&CParent::InitIterator,                                       &CParent::ReleaseIterator,                                       &CParent::CopyIterator,                                       &CParent::NextElement,                                       &GetElementPtr,                                       &EraseElement, &EraseAllElements);        }};template<typename Data>class CStlClassInfo_list{public:    typedef list<Data> TObjectType;    static TTypeInfo GetTypeInfo(TTypeInfo elementType)        {            return CStlClassInfoUtil::Get_list(elementType, &CreateTypeInfo);        }    static CTypeInfo* CreateTypeInfo(TTypeInfo elementType)        {            CStlOneArgTemplate* info =                new CStlOneArgTemplate(sizeof(TObjectType), elementType,                                       false);            SetFunctions(info);            return info;        }    static CTypeInfo* CreateTypeInfo(TTypeInfo elementType, const string& name)        {            CStlOneArgTemplate* info =                new CStlOneArgTemplate(sizeof(TObjectType), elementType,                                       false, name);            SetFunctions(info);            return info;        }    static TTypeInfo GetSetTypeInfo(TTypeInfo elementType)        {            return CStlClassInfoUtil::GetSet_list(elementType,                                                  &CreateSetTypeInfo);        }    static CTypeInfo* CreateSetTypeInfo(TTypeInfo elementType)        {            CStlOneArgTemplate* info =                new CStlOneArgTemplate(sizeof(TObjectType), elementType,                                       true);            SetFunctions(info);            return info;        }    static void SetFunctions(CStlOneArgTemplate* info)        {            CStlClassInfoFunctions<TObjectType>::SetMemFunctions(info);            CStlClassInfoFunctions<TObjectType>::SetAddElementFunctions(info);            CStlClassInfoFunctionsCI<TObjectType>::SetIteratorFunctions(info);            CStlClassInfoFunctionsI<TObjectType>::SetIteratorFunctions(info);        }};template<typename Data>class CStlClassInfo_vector{public:    typedef vector<Data> TObjectType;    static TTypeInfo GetTypeInfo(TTypeInfo elementType)        {            return CStlClassInfoUtil::Get_vector(elementType,                                                 &CreateTypeInfo);        }    static CTypeInfo* CreateTypeInfo(TTypeInfo elementType)        {            CStlOneArgTemplate* info =                new CStlOneArgTemplate(sizeof(TObjectType), elementType,                                       false);            SetFunctions(info);            return info;        }    static TTypeInfo GetSetTypeInfo(TTypeInfo elementType)        {            return CStlClassInfoUtil::GetSet_vector(elementType,                                                    &CreateSetTypeInfo);        }    static CTypeInfo* CreateSetTypeInfo(TTypeInfo elementType)        {            CStlOneArgTemplate* info =                new CStlOneArgTemplate(sizeof(TObjectType), elementType,                                       true);            SetFunctions(info);            return info;        }    static void SetFunctions(CStlOneArgTemplate* info)        {            CStlClassInfoFunctions<TObjectType>::SetMemFunctions(info);            CStlClassInfoFunctions<TObjectType>::SetAddElementFunctions(info);            CStlClassInfoFunctionsCI<TObjectType>::SetIteratorFunctions(info);            CStlClassInfoFunctionsI<TObjectType>::SetIteratorFunctions(info);        }};template<typename Data>class CStlClassInfo_set{public:    typedef set<Data> TObjectType;    static TTypeInfo GetTypeInfo(TTypeInfo elementType)        {            return CStlClassInfoUtil::Get_set(elementType, &CreateTypeInfo);        }    static CTypeInfo* CreateTypeInfo(TTypeInfo elementType)        {            CStlOneArgTemplate* info =                new CStlOneArgTemplate(sizeof(TObjectType), elementType,                                       true);            CStlClassInfoFunctions<TObjectType>::SetMemFunctions(info);            CStlClassInfoFunctions_set<TObjectType>::SetAddElementFunctions(info);            CStlClassInfoFunctionsCI<TObjectType>::SetIteratorFunctions(info);            CStlClassInfoFunctionsI_set<TObjectType>::SetIteratorFunctions(info);            return info;        }};template<typename Data>class CStlClassInfo_multiset{public:    typedef multiset<Data> TObjectType;    static TTypeInfo GetTypeInfo(TTypeInfo elementType)        {            return CStlClassInfoUtil::Get_multiset(elementType,                                                   &CreateTypeInfo);        }    static CTypeInfo* CreateTypeInfo(TTypeInfo elementType)        {            CStlOneArgTemplate* info =                new CStlOneArgTemplate(sizeof(TObjectType), elementType,                                       true);            CStlClassInfoFunctions<TObjectType>::SetMemFunctions(info);            CStlClassInfoFunctions_multiset<TObjectType>::SetAddElementFunctions(info);            CStlClassInfoFunctionsCI<TObjectType>::SetIteratorFunctions(info);            CStlClassInfoFunctionsI_set<TObjectType>::SetIteratorFunctions(info);            return info;        }};template<typename Key, typename Value>class CStlClassInfo_map{public:    typedef map<Key, Value> TObjectType;    typedef typename TObjectType::value_type TElementType;    static TTypeInfo GetTypeInfo(TTypeInfo keyType, TTypeInfo valueType)        {            return CStlClassInfoUtil::Get_map(keyType, valueType,                                              &CreateTypeInfo);        }    static CTypeInfo* CreateTypeInfo(TTypeInfo keyType, TTypeInfo valueType)

⌨️ 快捷键说明

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