From 0f236d9bc06803cce037fb6391c123cc99e81b90 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 12 Jul 2024 02:50:38 +0800 Subject: [PATCH] Added IDName.cpp/.h --- inc/hgl/type/IDName.h | 100 ++++++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 15 +++++-- src/Type/IDName.cpp | 30 +++++++++++++ 3 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 inc/hgl/type/IDName.h create mode 100644 src/Type/IDName.cpp diff --git a/inc/hgl/type/IDName.h b/inc/hgl/type/IDName.h new file mode 100644 index 0000000..d4c4a95 --- /dev/null +++ b/inc/hgl/type/IDName.h @@ -0,0 +1,100 @@ +#pragma once + +#include +#include + +namespace hgl +{ + template + bool RegistryIDName(const size_t hash_code,ConstStringView &csv,const SC *name_string,const int name_length); + + /** + * 顺序ID+名称数据结构模板
+ * 按添加进来的名字先后顺序一个个产生连续的序号,所有数据只可读不可写 + */ + template class OrderedIDName + { + public: + + using SelfClass=OrderedIDName; + + protected: + + ConstStringView csv; + + protected: + + void Clear() + { + csv.id=-1; + csv.length=-1; + csv.str=nullptr; + } + + void Update(const SC *name_string,const int name_length) + { + if(name_length<=0) + { + Clear(); + return; + } + + RegistryIDName(typeid(*this).hash_code(),csv,name_string,name_length); + } + + public: + + static const size_t GetClassID () ///<获取类ID + { + static SelfClass self; + static size_t class_id=typeid(self).hash_code(); + + return class_id; + } + + const int GetID ()const{return csv.id;} ///<获取名称ID + const SC * GetName ()const{return csv.GetString();} ///<获取名称字符串 + const int GetNameLength ()const{return csv.length;} ///<获取名称字符串长度 + + public: + + OrderedIDName() + { + Clear(); + } + + OrderedIDName(const SC *name_string) + { + Update(name_string,hgl::strlen(name_string)); + } + + void operator = (const SC *name_string) + { + Update(name_string,hgl::strlen(name_string)); + } + + void operator = (const String &name_string) + { + Update(name_string.c_str(),name_string.Length()); + } + + void operator = (const SelfClass &id_name) + { + hgl_cpy(csv,id_name.csv); + } + + public: + + const int Comp(const OrderedIDName &oin)const{return GetID()-oin.GetID();} + + CompOperator(const OrderedIDName &,Comp) + };//class IDName + +#define DefineIDName(name,type) using name=OrderedIDName; //使用__COUNTER__是为了让typeid()不同 + + DefineIDName(AnsiIDName, char) + DefineIDName(WideIDName, wchar_t) + DefineIDName(UTF8IDName, u8char) + DefineIDName(UTF16IDName, u16char) + DefineIDName(OSIDName, os_char) +}//namespace hgl diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9aa32b5..7029dc8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,6 +15,14 @@ SET(CORE_PLATFORM_HEADER_FILES ${CORE_PLATFORM_HEADER_FILES} SET(TYPE_INCLUDE_PATH ${CMCORE_ROOT_INCLUDE_PATH}/hgl/type) +SET(TYPE_IDNAME_HEADER_FILES ${TYPE_INCLUDE_PATH}/ConstStringSet.h + ${TYPE_INCLUDE_PATH}/IDName.h) + +SET(TYPE_IDNAME_SOURCE_FILES Text/ConstStringSetSaveToTextStream.cpp + Type/IDName.cpp) + +SOURCE_GROUP("DataType\\IDName" FILES ${TYPE_IDNAME_HEADER_FILES} ${TYPE_IDNAME_SOURCE_FILES}) + SET(TYPE_COLLECTION_SOURCE ${TYPE_INCLUDE_PATH}/Collection.h Type/Collection.cpp) @@ -74,7 +82,6 @@ SET(STRING_HEADER_FILES ${TYPE_INCLUDE_PATH}/String.h ${TYPE_INCLUDE_PATH}/SplitString.h ${TYPE_INCLUDE_PATH}/MergeString.h ${TYPE_INCLUDE_PATH}/StdString.h - ${TYPE_INCLUDE_PATH}/ConstStringSet.h ) SET(TEXT_HEADER_FILES ${CMCORE_ROOT_INCLUDE_PATH}/hgl/Endian.h @@ -85,8 +92,7 @@ SET(TEXT_HEADER_FILES ${CMCORE_ROOT_INCLUDE_PATH}/hgl/Endian.h SET(TEXT_SOURCE_FILES Text/Endian.cpp Text/CodePage.cpp - Text/UnicodeBlocks.cpp - Text/ConstStringSetSaveToTextStream.cpp) + Text/UnicodeBlocks.cpp) SOURCE_GROUP("Text\\String" FILES ${STRING_HEADER_FILES} Text/StringList.cpp) @@ -237,6 +243,9 @@ add_cm_library(CMCore "CM" ${CORE_PLATFORM_HEADER_FILES} ${IO_SOURCE_FILES} + ${TYPE_IDNAME_HEADER_FILES} + ${TYPE_IDNAME_SOURCE_FILES} + ${MATH_HEADER_FILES} ${MATH_SOURCE_FILES} diff --git a/src/Type/IDName.cpp b/src/Type/IDName.cpp new file mode 100644 index 0000000..234efce --- /dev/null +++ b/src/Type/IDName.cpp @@ -0,0 +1,30 @@ +#include + +namespace hgl +{ + template + bool RegistryIDName(const size_t hash_code,ConstStringView &csv,const SC *name_string,const int name_length) + { + static ObjectMap> css_map; + + ConstStringSet *css; + + if(!css_map.Get(hash_code,css)) + { + css=new ConstStringSet; + css_map.Add(hash_code,css); + } + + return(css->AddString(csv,name_string,name_length)>=0); + } + +#define REGISTRY_ID_NAME(type) bool RegistryIDName_##type(const size_t hash_code,ConstStringView &csv,const type *name,const int length){return RegistryIDName(hash_code,csv,name,length);} + + REGISTRY_ID_NAME(char) + REGISTRY_ID_NAME(wchar_t) + REGISTRY_ID_NAME(u8char) + REGISTRY_ID_NAME(u16char) + REGISTRY_ID_NAME(os_char) + +#undef REGISTRY_ID_NAME +}//namespace hgl