added ObjectRelationTest.cpp

This commit is contained in:
hyzboy 2024-11-19 01:38:03 +08:00
parent c4b7f7a5e8
commit 84a11a6032

View File

@ -0,0 +1,153 @@
/**
1. type_hash , typeid(T).hash_code()
serial number
2.
3.
4.serial
*/
#include<hgl/type/object/Object.h>
#include<hgl/type/List.h>
#include<iostream>
using namespace hgl;
using namespace std;
#define CLASS_TYPE_HASH(type) public: static const size_t StaticTypeHash(){return typeid(type).hash_code();}
class BaseObject
{
size_t object_hash_code;
size_t object_serial;
CLASS_TYPE_HASH(BaseObject)
public:
BaseObject(const size_t hash,const size_t os)
{
object_hash_code=hash;
object_serial =os;
}
virtual ~BaseObject()=default;
const size_t GetTypeHash()const{return object_hash_code;}
const size_t GetObjectSerial()const{return object_serial;}
};//class BaseObject
#define CLASS_BODY(class_type) CLASS_TYPE_HASH(class_type) \
private: \
static const size_t CreateObjectSerial(){static size_t serial=0;return ++serial;} \
public: \
class_type():BaseObject(class_type::StaticTypeHash(),class_type::CreateObjectSerial()){} \
virtual ~class_type()=default;
template<typename T> inline const bool IsType(BaseObject *bo){return bo?(bo->GetTypeHash()==T::StaticTypeHash()):false;}
class TestObject:public BaseObject
{
CLASS_BODY(TestObject)
public:
};
template<typename T> class SharedObject
{
T *obj;
int ref_count;
int weak_count;
public:
SharedObject()
{
obj=nullptr;
ref_count=0;
weak_count=0;
}
~SharedObject()
{
if(obj)
delete obj;
}
void SetObject(T *o)
{
if(obj)
delete obj;
obj=o;
}
T *GetObject()
{
return obj;
}
void AddRef()
{
++ref_count;
}
void DelRef()
{
if(ref_count>0)
--ref_count;
}
void AddWeak()
{
++weak_count;
}
void DelWeak()
{
if(weak_count>0)
--weak_count;
}
int GetRefCount()const
{
return ref_count;
}
int GetWeakCount()const
{
return weak_count;
}
};
int main(int,char **)
{
TestObject to1,to2,to3;
BaseObject *bo=&to3;
std::cout<<"TestObject::StaticHash:"<<TestObject::StaticTypeHash()<<std::endl;
std::cout<<"to1.serial: "<<to1.GetObjectSerial()<<std::endl;
std::cout<<"to2.serial: "<<to2.GetObjectSerial()<<std::endl;
std::cout<<"bo->StaticHash: "<<bo->StaticTypeHash()<<std::endl;
std::cout<<"bo->TypeHash: "<<bo->GetTypeHash()<<std::endl;
std::cout<<"bo->Serial: "<<bo->GetObjectSerial()<<std::endl;
const bool result=IsType<TestObject>(bo);
std::cout<<"IsType<TestObject>(bo) result is "<<(result?"true":"false")<<std::endl;
return 0;
}