diff --git a/inc/hgl/type/object/DefaultCreateObject.h b/inc/hgl/type/object/DefaultCreateObject.h deleted file mode 100644 index dc8d67c..0000000 --- a/inc/hgl/type/object/DefaultCreateObject.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include - -namespace hgl -{ - template SafePtr DefaultCreateObject(const char *source_file,const char *source_function,const size_t source_line,ARGS...args) - { - const size_t hc=GetTypeHash(); - - ObjectManager *om=GetObjectManager(hc); - - if(!om) - return SafePtr(); - - DefaultObjectManager *dom=static_cast *>(om); - - const SourceCodeLocation scl - { - .file=source_file, - .func=source_function, - .line=source_line - }; - - SafePtrData *spd=dom->CreateObject(scl,args...); - - return SafePtr(spd); - } - - #define HGL_NEW_OBJECT(class_name,...) DefaultCreateObject(__FILE__,__FUNCTION__,__LINE__ __VA_OPT__(,) __VA_ARGS__) - - #define HGL_DEFINE_OBJECT(class_name,type_name,...) SafePtr type_name=HGL_NEW_OBJECT(class_name __VA_OPT__(,) __VA_ARGS__) -}//namespace hgl - diff --git a/inc/hgl/type/object/Object.h b/inc/hgl/type/object/Object.h index 4092557..f597818 100644 --- a/inc/hgl/type/object/Object.h +++ b/inc/hgl/type/object/Object.h @@ -1,235 +1,231 @@ #pragma once #include #include -#include namespace hgl { /** - * 基础对象. + * 基础对象 */ class Object { - ObjectBaseInfo object_base_info; + ObjectBaseInfo object_info; public: - const ObjectSimpleInfo &GetObjectSimpleInfo () const noexcept { return object_base_info; } ///<获取对象简单信息 - const ObjectBaseInfo & GetObjectBaseInfo () const noexcept { return object_base_info; } ///<获取对象基本信息 + const ObjectBaseInfo & GetObjectBaseInfo () const noexcept { return object_info; } ///<获取对象简单信息 - ObjectManager * GetObjectManager () noexcept { return object_base_info.object_manager; } ///<获取对象管理器 + const size_t GetTypeHash () const noexcept { return object_info.hash_code; } ///<获取对象数据类型的hash值 + const size_t GetUniqueID () const noexcept { return object_info.unique_id; } ///<获取对象的唯一序列号 - const size_t GetTypeHash () const noexcept { return object_base_info.hash_code; } ///<获取对象数据类型的hash值 - const size_t GetSerialNumber () const noexcept { return object_base_info.serial_number; } ///<获取对象的序列号 + public: - protected: - - template friend class SafePtr; - template friend struct DefaultObjectAllocator; +// template friend class SafePtr; +// template friend struct DefaultObjectAllocator; NO_COPY(Object) NO_MOVE(Object) - Object(const ObjectBaseInfo &obi) noexcept { object_base_info=obi; } + Object(const ObjectBaseInfo &oi) noexcept { object_info=oi; } virtual ~Object()=default; - - virtual void Deinitailize()=0; + + //virtual bool Initailize()=0; + //virtual void Deinitailize()=0; };//class Object - template class DefaultObjectManager; - - #define HGL_OBJECT_CLASS_BODY(class_name) \ - private: \ - \ - friend struct DefaultObjectAllocator;\ - \ - using Object::Object; \ - /*class_name(const ObjectBaseInfo &obi):Object(obi)*/ \ - /*{std::cout<<#class_name " Construct("<();} \ - - - - template struct SafePtrData + template inline T *New(const SourceCodeLocation &scl) { - T *ptr; - int count; + static size_t new_count=0; - private: + ObjectBaseInfo obi; - SafePtrData(T *p) - { - ptr=p; - count=0; - } + obi.hash_code=GetTypeHash(); + obi.unique_id=new_count; + obi.scl=scl; - ~SafePtrData()=default; + ++new_count; - template friend class DefaultObjectManager; - }; + T *obj=new T(obi); - /** - * 安全访问指针
- * 其本质类似于的WeakPtr,但是不同的是: - *
    - *
  • SafePtr不使用atom计数器,所以它不是线程安全的
  • - *
  • SafePtr不会自动释放指针,它是在访问时检查指针是否有效,如果无效则返回nullptr
  • - *
- */ - template class SafePtr - { - SafePtrData *data; + return obj; + } - public: + #define NewObject(T,obj) T *obj=New(HGL_SCL_HERE); - SafePtr() - { - data=nullptr; - } + //template struct SafePtrData + //{ + // T *ptr; + // int count; - SafePtr(SafePtrData *spd) - { - data=spd; + //private: - if(data) - ++data->count; - } + // SafePtrData(T *p) + // { + // ptr=p; + // count=0; + // } - public: + // ~SafePtrData()=default; - virtual ~SafePtr() - { - Release(); - } + // template friend class DefaultObjectManager; + //}; - T *Get() {return data?data->ptr:nullptr;} - const T *Get() const {return data?data->ptr:nullptr;} + ///** + // * 安全访问指针
+ // * 其本质类似于的WeakPtr,但是不同的是: + // *
    + // *
  • SafePtr不使用atom计数器,所以它不是线程安全的
  • + // *
  • SafePtr不会自动释放指针,它是在访问时检查指针是否有效,如果无效则返回nullptr
  • + // *
+ // */ + //template class SafePtr + //{ + // SafePtrData *data; - T *operator->() { return Get(); } - T &operator* () { return *Get(); } + //public: - const T *operator->() const { return Get(); } + // SafePtr() + // { + // data=nullptr; + // } - const bool operator==(const T *ptr) const noexcept { return Get()==ptr; } - const bool operator!=(const T *ptr) const noexcept { return Get()!=ptr; } + // SafePtr(SafePtrData *spd) + // { + // data=spd; - const bool operator==(const SafePtr &sp) const { return Get()==sp.Get(); } - const bool operator!=(const SafePtr &sp) const { return Get()!=sp.Get(); } + // if(data) + // ++data->count; + // } - const bool IsValid() const noexcept ///<当前对象指针是否有效 - { - return data&&data->ptr; - } + //public: - SafePtr &operator=(SafePtr &sp) - { - if(!sp.IsValid()) - { - Release(); - return *this; - } + // virtual ~SafePtr() + // { + // Release(); + // } - if(data) - { - if(data->ptr==sp.data->ptr) - return *this; + // T *Get() {return data?data->ptr:nullptr;} + // const T *Get() const {return data?data->ptr:nullptr;} - Release(); - } + // T *operator->() { return Get(); } + // T &operator* () { return *Get(); } - data=sp.data; - ++data->count; + // const T *operator->() const { return Get(); } - return *this; - } + // const bool operator==(const T *ptr) const noexcept { return Get()==ptr; } + // const bool operator!=(const T *ptr) const noexcept { return Get()!=ptr; } - template - SafePtr &operator=(SafePtr &spd) - { - if(T::StaticTypeHash()!=OT::StaticTypeHash()) - { - Release(); - return *this; - } + // const bool operator==(const SafePtr &sp) const { return Get()==sp.Get(); } + // const bool operator!=(const SafePtr &sp) const { return Get()!=sp.Get(); } - if(data!=spd.data) - { - Release(); - data=spd.data; - ++data->count; - } + // const bool IsValid() const noexcept ///<当前对象指针是否有效 + // { + // return data&&data->ptr; + // } - return *this; - } + // SafePtr &operator=(SafePtr &sp) + // { + // if(!sp.IsValid()) + // { + // Release(); + // return *this; + // } - SafePtr &operator=(Object *obj)=delete; + // if(data) + // { + // if(data->ptr==sp.data->ptr) + // return *this; - /** - * 强制释放对象(不管所有权问题,强制释放) - */ - void Destory() - { - if(!data) - return; + // Release(); + // } - if(!data->ptr) - return; + // data=sp.data; + // ++data->count; - ObjectManager *om=data->ptr->GetObjectManager(); + // return *this; + // } - if(!om) - { - //std::cerr<<"SafePtr<"<()<<">::Destory() error, manager is null."<()<<">::Destory() serial:"<ptr->GetSerialNumber()< + // SafePtr &operator=(SafePtr &spd) + // { + // if(T::StaticTypeHash()!=OT::StaticTypeHash()) + // { + // Release(); + // return *this; + // } - DefaultObjectManager *dom=static_cast *>(om); + // if(data!=spd.data) + // { + // Release(); + // data=spd.data; + // ++data->count; + // } - dom->ReleaseObject(data); + // return *this; + // } - data=nullptr; - } + // SafePtr &operator=(Object *obj)=delete; - /** - * 释放对象(释放所有权,不代表会被释放。当所有权计数为0时会被释放) - * - * \return 依然持有对象的数量 - */ - int Release() - { - if(!data) - return -1; + // /** + // * 强制释放对象(不管所有权问题,强制释放) + // */ + // void Destory() + // { + // if(!data) + // return; - //if(data->ptr) - //{ - // std::cout<<"SafePtr<"<()<<">::Release() serial:"<ptr->GetSerialNumber()<ptr) + // return; - int result; + // ObjectManager *om=data->ptr->GetObjectManager(); - if(data->count==1) - { - Destory(); - result=0; - } - else - { - --data->count; + // if(!om) + // { + // //std::cerr<<"SafePtr<"<()<<">::Destory() error, manager is null."<()<<">::Destory() serial:"<ptr->GetSerialNumber()<count; - } + // DefaultObjectManager *dom=static_cast *>(om); - data=nullptr; - return result; - } - };//template class SafePtr + // dom->ReleaseObject(data); + + // data=nullptr; + // } + + // /** + // * 释放对象(释放所有权,不代表会被释放。当所有权计数为0时会被释放) + // * + // * \return 依然持有对象的数量 + // */ + // int Release() + // { + // if(!data) + // return -1; + + // //if(data->ptr) + // //{ + // // std::cout<<"SafePtr<"<()<<">::Release() serial:"<ptr->GetSerialNumber()<count==1) + // { + // Destory(); + // result=0; + // } + // else + // { + // --data->count; + + // result=data->count; + // } + + // data=nullptr; + // return result; + // } + //};//template class SafePtr }//namespace hgl diff --git a/inc/hgl/type/object/ObjectAllocator.h b/inc/hgl/type/object/ObjectAllocator.h deleted file mode 100644 index 40a2437..0000000 --- a/inc/hgl/type/object/ObjectAllocator.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once -//#include - -namespace hgl -{ - struct ObjectBaseInfo; - class Object; - class ObjectManager; - - /** - * 对象分配器. - */ - struct ObjectAllocator - { - virtual void Join (ObjectManager *) {}; ///<桥接一个对象管理器 - virtual void Unjoin (ObjectManager *) {}; ///<断开一个对象管理器 - - virtual Object *Create (const ObjectBaseInfo &obi)=0; ///<创建一个新对象 - virtual void Release (Object *)=0; ///<释放一个对象 - - /** - * 准备断开对象管理器 - * @param not_release_objects_count 未释放的对象数量 - * @return 是否需要逐个释放(如返回true则会调用CleanNotReleaseObject逐个释放) - */ - virtual bool PreUnjoin(size_t not_release_objects_count) - { - //std::cerr<<"DefaultObjectManager::~DefaultObjectManager("<GetObjectBaseInfo(); - - //std::cout<<"Object(hash_code="< struct DefaultObjectAllocator:public ObjectAllocator - { - virtual Object *Create(const ObjectBaseInfo &obi)override - { - return new T(obi); - } - - virtual void Release(Object *obj)override - { - delete obj; - } - }; -}//namespace hgl - diff --git a/inc/hgl/type/object/ObjectBaseInfo.h b/inc/hgl/type/object/ObjectBaseInfo.h index 5da1ec2..2b062dd 100644 --- a/inc/hgl/type/object/ObjectBaseInfo.h +++ b/inc/hgl/type/object/ObjectBaseInfo.h @@ -1,28 +1,32 @@ #pragma once #include +#include namespace hgl { - class ObjectManager; - /** * 对象简单信息 */ - struct ObjectSimpleInfo + struct ObjectBaseInfo { size_t hash_code; ///<对象数据类型的hash值 - size_t serial_number; ///<对象序列号 + size_t unique_id; ///<唯一序列号 + + SourceCodeLocation scl; }; - /** - * 对象基本信息 - */ - struct ObjectBaseInfo:public ObjectSimpleInfo + struct ObjectTotalInfo { - ObjectManager * object_manager; ///<对象管理器 + size_t hash_code; - SourceCodeLocation source_code_location; ///<对象创建的源代码位置 + std::type_info *info; + + size_t count; }; + + void RegistryObjectHash(const size_t &hash_code,const std::type_info *); + + const ObjectTotalInfo *GetObjectTotalInfo(const size_t &hash_code); }//namespace hgl diff --git a/inc/hgl/type/object/ObjectManager.h b/inc/hgl/type/object/ObjectManager.h deleted file mode 100644 index e28520c..0000000 --- a/inc/hgl/type/object/ObjectManager.h +++ /dev/null @@ -1,168 +0,0 @@ -#pragma once -#include"Object.h" -#include"ObjectAllocator.h" -#include -#include - -namespace hgl -{ - class Object; - - /** - * 对象管理器基类. - */ - class ObjectManager - { - size_t object_hash_code; - const char *object_type_name; - size_t object_count; - - protected: - - const size_t AcquireSerialNumber(){return ++object_count;} - - public: - - const size_t GetTypeHash()const{return object_hash_code;} - const char * GetTypename()const{return object_type_name;} - const size_t GetCount()const{return object_count;} - - public: - - ObjectManager(const size_t &hc,const char *tn) - { - object_hash_code=hc; - object_type_name=tn; - object_count=0; - } - - virtual ~ObjectManager()=default; - };//class ObjectManager - - bool RegistryObjectManager(ObjectManager *om); ///<注册一个对象管理器 - void UnregistryObjectManager(ObjectManager *om); ///<注销一个对象管理器 - - /** - * 缺省对象管理器 - */ - template class DefaultObjectManager:public ObjectManager - { - tsl::robin_set object_set; - tsl::robin_map *> object_map; - - ObjectAllocator *object_allocator; - - public: - - DefaultObjectManager(ObjectAllocator *oa):ObjectManager(typeid(T).hash_code(),typeid(T).name()) - { - object_allocator=oa; - - object_allocator->Join(this); - RegistryObjectManager(this); - } - - virtual ~DefaultObjectManager() - { - if(object_set.size()) - { - if(object_allocator->PreUnjoin(object_set.size())) //这里返回的是是否需要逐个释放 - { - for(auto &it:object_set) - { - object_allocator->CleanNotReleaseObject(it); - } - } - } - - object_allocator->Unjoin(this); - UnregistryObjectManager(this); - } - - protected: - - template friend SafePtr DefaultCreateObject(const char *source_file,const char *source_function,const size_t source_line,ARGS...args); - - template - SafePtrData *CreateObject(const SourceCodeLocation &scl,ARGS...args) - { - ObjectBaseInfo obi; - - obi.hash_code =GetTypeHash(); - obi.object_manager =this; - obi.serial_number =AcquireSerialNumber(); - obi.source_code_location=scl; - - Object *obj=object_allocator->Create(obi); - - SafePtrData *spd=new SafePtrData((T *)obj); - - object_set.insert({(T *)obj}); - object_map.insert({obj->GetSerialNumber(),spd}); - - spd->ptr->Initailize(args...); - - return spd; - } - - template friend class SafePtr; - - void ReleaseObject(SafePtrData *spd) - { - if(!spd) - return; - - object_map.erase(spd->ptr->GetSerialNumber()); - object_set.erase(spd->ptr); - - if(spd->ptr) - { - spd->ptr->Deinitailize(); - object_allocator->Release(spd->ptr); - spd->ptr=nullptr; - } - - if(spd->count>1) - { - --spd->count; - } - else - { - delete spd; - } - } - - template friend SafePtr GetObjectBySerial(const size_t &serial); - - SafePtrData *GetObjectBySerial(const size_t &serial) - { - return object_map.at(serial); - } - };//class DefaultObjectManager - - #define HGL_DEFINE_DEFAULT_OBJECT_MANAGER(T) namespace \ - { \ - static DefaultObjectAllocator T##ObjectAllocator; \ - static DefaultObjectManager T##ObjectManager(&T##ObjectAllocator); \ - } - - ObjectManager *GetObjectManager(const size_t &hash_code); ///<取得一个对象管理器 - - template inline ObjectManager *GetObjectManager() ///<取得一个对象管理器 - { - return GetObjectManager(typeid(T).hash_code()); - } - - template inline SafePtr GetObjectBySerial(const size_t &serial) ///<通过序列号取得一个对象 - { - ObjectManager *om=GetObjectManager(); - - if(!om) - return SafePtr(); - - DefaultObjectManager *dom=static_cast *>(om); - - return SafePtr(dom->GetObjectBySerial(serial)); - } -}//namespace hgl - diff --git a/inc/hgl/type/object/ObjectRelation.h b/inc/hgl/type/object/ObjectRelation.h deleted file mode 100644 index c91a0d7..0000000 --- a/inc/hgl/type/object/ObjectRelation.h +++ /dev/null @@ -1,30 +0,0 @@ - -#pragma once - -#include -#include -//#include - -namespace hgl -{ - struct ObjectReferringRecord - { - ObjectSimpleInfo osi; - - size_t refer_serial; ///<引用序号 - - SourceCodeLocation scl; - }; - - /** - * 对象引用关系 - */ - struct ObjectRelation - { - List referring_me; ///<引用自己的对象 - List me_referring; ///<自己引用的对象 - - //tsl::robin_map< size_t, /*refer_serial*/ - // ObjectReferringRecord *> referring_me_map; ///<引用自己的对象 - };//struct ObjectRelation -}//namespace hgl diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e838f7..3eab261 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -58,14 +58,10 @@ SET(SYSTEM_INFO_SOURCE ${CORE_PLATFORM_INCLUDE_PATH}/SystemInfo.h SET(MATH_INCLUDE_PATH ${CMCORE_ROOT_INCLUDE_PATH}/hgl/math) SET(BASE_OBJECT_HEADER_FILES ${TYPE_INCLUDE_PATH}/object/ObjectBaseInfo.h - ${TYPE_INCLUDE_PATH}/object/ObjectRelation.h - ${TYPE_INCLUDE_PATH}/object/Object.h - ${TYPE_INCLUDE_PATH}/object/ObjectAllocator.h - ${TYPE_INCLUDE_PATH}/object/ObjectManager.h - ${TYPE_INCLUDE_PATH}/object/DefaultCreateObject.h) + ${TYPE_INCLUDE_PATH}/object/Object.h) -SET(BASE_OBJECT_SOURCE_FILES Object/Object.cpp - Object/ObjectManager.cpp +SET(BASE_OBJECT_SOURCE_FILES Object/ObjectBaseInfo.cpp + Object/Object.cpp Object/TickObject.cpp) SOURCE_GROUP("DataType\\Object" FILES ${BASE_OBJECT_HEADER_FILES} diff --git a/src/Object/ObjectManager.cpp b/src/Object/ObjectManager.cpp deleted file mode 100644 index 576177d..0000000 --- a/src/Object/ObjectManager.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include -//#include -//#include -#include - -namespace hgl -{ - namespace - { - using ObjectManagerMap=tsl::robin_map; - static ObjectManagerMap *object_manager_map=nullptr; - - ObjectManagerMap *GetObjectManagerMap() - { - if(!object_manager_map) - object_manager_map=new ObjectManagerMap; - - return(object_manager_map); - } - }//namespace - - bool RegistryObjectManager(ObjectManager *om) - { - if(!om) - return(false); - - const size_t hc=om->GetTypeHash(); - - auto *omm=GetObjectManagerMap(); - - if(omm->contains(hc)) - return(false); - - omm->insert({hc,om}); - - //std::cout<<"RegistryObjectManager("<GetTypename()<<")"<GetTypeHash(); - - auto *omm=GetObjectManagerMap(); - - auto omi=omm->find(hc); - - if(omi.key()!=hc) - return; - - //std::cout<<"UnregistryObjectManager("<GetTypename()<<")"<erase(hc); - } - - ObjectManager *GetObjectManager(const size_t &hash_code) - { - auto *omm=GetObjectManagerMap(); - - auto omi=omm->find(hash_code); - - if(omi.key()==hash_code) - return(omi.value()); - else - return(nullptr); - } -}//namespace hgl