added TypeEqual()

This commit is contained in:
hyzboy 2024-11-19 02:06:33 +08:00
parent 84a11a6032
commit 881a656f34

View File

@ -21,16 +21,13 @@
using namespace hgl; using namespace hgl;
using namespace std; using namespace std;
#define CLASS_TYPE_HASH(type) public: static const size_t StaticTypeHash(){return typeid(type).hash_code();} #define CLASS_TYPE_HASH(type) static const size_t StaticTypeHash(){return typeid(type).hash_code();}
class BaseObject class BaseObject
{ {
size_t object_hash_code; size_t object_hash_code;
size_t object_serial; size_t object_serial;
CLASS_TYPE_HASH(BaseObject)
public: public:
BaseObject(const size_t hash,const size_t os) BaseObject(const size_t hash,const size_t os)
@ -40,21 +37,30 @@ public:
} }
virtual ~BaseObject()=default; virtual ~BaseObject()=default;
CLASS_TYPE_HASH(BaseObject)
const size_t GetTypeHash()const{return object_hash_code;} const size_t GetTypeHash()const{return object_hash_code;}
const size_t GetObjectSerial()const{return object_serial;} const size_t GetObjectSerial()const{return object_serial;}
};//class BaseObject };//class BaseObject
#define CLASS_BODY(class_type) CLASS_TYPE_HASH(class_type) \ #define CLASS_BODY(class_type) private: \
private: \
static const size_t CreateObjectSerial(){static size_t serial=0;return ++serial;} \ static const size_t CreateObjectSerial(){static size_t serial=0;return ++serial;} \
public: \ public: \
class_type():BaseObject(class_type::StaticTypeHash(),class_type::CreateObjectSerial()){} \ class_type():BaseObject(class_type::StaticTypeHash(),class_type::CreateObjectSerial()){} \
virtual ~class_type()=default; virtual ~class_type()=default; \
CLASS_TYPE_HASH(class_type)
template<typename T> inline const bool IsType(BaseObject *bo){return bo?(bo->GetTypeHash()==T::StaticTypeHash()):false;} template<typename T> inline const bool IsType(BaseObject *bo){return bo?(bo->GetTypeHash()==T::StaticTypeHash()):false;}
inline const bool TypeEqual(BaseObject *bo1,BaseObject *bo2)
{
if(!bo1||!bo2)return(false);
return bo1->GetTypeHash()==bo2->GetTypeHash();
}
class TestObject:public BaseObject class TestObject:public BaseObject
{ {
CLASS_BODY(TestObject) CLASS_BODY(TestObject)
@ -145,9 +151,13 @@ int main(int,char **)
std::cout<<"bo->TypeHash: "<<bo->GetTypeHash()<<std::endl; std::cout<<"bo->TypeHash: "<<bo->GetTypeHash()<<std::endl;
std::cout<<"bo->Serial: "<<bo->GetObjectSerial()<<std::endl; std::cout<<"bo->Serial: "<<bo->GetObjectSerial()<<std::endl;
const bool result=IsType<TestObject>(bo); bool result=IsType<TestObject>(bo);
std::cout<<"IsType<TestObject>(bo) result is "<<(result?"true":"false")<<std::endl; std::cout<<"IsType<TestObject>(bo) result is "<<(result?"true":"false")<<std::endl;
result=TypeEqual(&to1,bo);
std::cout<<"TypeEqual(&to1,bo) result is "<<(result?"true":"false")<<std::endl;
return 0; return 0;
} }