diff --git a/engine/3rdparty/zlib/include/refl/detail/container.inl b/engine/3rdparty/zlib/include/refl/detail/container.inl index 1ccee54..423713a 100644 --- a/engine/3rdparty/zlib/include/refl/detail/container.inl +++ b/engine/3rdparty/zlib/include/refl/detail/container.inl @@ -26,20 +26,22 @@ namespace refl { return cls->vsize(ptr); } auto begin() { - auto it = cls->vbegin(ptr); - return iterator(it, cls); + Container::iterator it(cls); + cls->vbegin(it, ptr); + return it; } auto end() { - auto it = cls->vend(ptr); - return iterator(it, cls); + Container::iterator it(cls); + cls->vend(it, ptr); + return it; } // Iterator class class iterator : public UClass_Container::iterator{ private: const UClass_Container* cls; public: - iterator(UClass_Container::iterator it,const UClass_Container* cls) - : UClass_Container::iterator(it), cls(cls) {} + iterator(const UClass_Container* cls) + : cls(cls) {} iterator& operator++() noexcept { cls->viterator_add(this); return *this; diff --git a/engine/3rdparty/zlib/include/refl/detail/uclass.inl b/engine/3rdparty/zlib/include/refl/detail/uclass.inl index bc1ebd9..bee7386 100644 --- a/engine/3rdparty/zlib/include/refl/detail/uclass.inl +++ b/engine/3rdparty/zlib/include/refl/detail/uclass.inl @@ -107,16 +107,16 @@ namespace refl { return cls; } }; + constexpr static std::array IndexNames = { + "1", "2", "3", "4", "5", "6", "7", "8", + "9", "10", "11", "12", "13", "14", "15", "16" + }; template class UClass_Tuple : public UClass { using UClass::UClass; using MyUClass = UClass_Tuple; using MyTuple = std::tuple; public: - constexpr static std::array IndexNames = { - "1", "2", "3", "4", "5", "6", "7", "8", - "9", "10", "11", "12", "13", "14", "15", "16" - }; std::array Fields; static bool construct(void* ptr, const UClass* cls, const sarray& ArgsList) { new(ptr)MyTuple(); @@ -125,11 +125,27 @@ namespace refl { static void destruct(void* ptr) { ((MyTuple*)ptr)->~MyTuple(); } - template + template static FieldPtr field_in_tuple() { - MemberData member; constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; - return { FName(""), &TypeInfo::StaticClass, member, flag}; + const MyTuple* tuple_ptr = nullptr; + const auto& element = std::get(*tuple_ptr); + const std::ptrdiff_t offset = reinterpret_cast(&element) - reinterpret_cast(tuple_ptr); + MemberData member; + member.offset = offset; + return { IndexNames[Index], &TypeInfo::StaticClass, member, flag}; + } + template + void BuildFields(std::index_sequence) { + auto ptr = &Fields[0]; + (..., (*ptr = field_in_tuple(), ptr++)); + } + UClass_Tuple():UClass(type_name().View(), sizeof(MyTuple)) { + assert(sizeof...(Types) < IndexNames.size()); + BuildFields(std::index_sequence_for{}); + vtable.Construct = &MyUClass::construct; + vtable.Destruct = &MyUClass::destruct; + vtable.GetFields = &MyUClass::GetFields; } const sarray GetFields(EFieldFind find, const Name& name) const { return sarray(&Fields[0], sizeof...(Types)); @@ -138,20 +154,51 @@ namespace refl { auto cls = static_cast(_cls); return cls->GetFields(find, name); } - UClass_Tuple():UClass(type_name().View(), sizeof(MyTuple)) { + }; + template + class UClass_Pair : public UClass { + using UClass::UClass; + using MyUClass = UClass_Tuple; + using MyPair = std::pair; + public: + std::array Fields; + static bool construct(void* ptr, const UClass* cls, const sarray& ArgsList) { + new(ptr)MyPair(); + return true; + } + static void destruct(void* ptr) { + ((MyPair*)ptr)->~MyPair(); + } + template + static FieldPtr field_in_pair() { + constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; + const MyPair* pair_ptr = nullptr; + MemberData member; + if constexpr (Index == 0) { + const auto& first = pair_ptr->first; + const std::ptrdiff_t offset = reinterpret_cast(&first) - reinterpret_cast(pair_ptr); + member.offset = offset; + } + else { + const auto& second = pair_ptr->second; + const std::ptrdiff_t offset = reinterpret_cast(&second) - reinterpret_cast(pair_ptr); + member.offset = offset; + } + return { IndexNames[Index], &TypeInfo::StaticClass, member, flag }; + } + UClass_Pair() :UClass(type_name().View(), sizeof(MyPair)) { + Fields[0] = field_in_pair(); + Fields[1] = field_in_pair(); vtable.Construct = &MyUClass::construct; vtable.Destruct = &MyUClass::destruct; vtable.GetFields = &MyUClass::GetFields; - auto ptr = &Fields[0]; - (..., (*ptr = field_in_tuple(), ptr++)); - Offset offset = 0; - constexpr int N = sizeof...(Types); - assert(N < IndexNames.size()); - for (int i = 0; i < N; i++) { - Fields[i].name = IndexNames[i]; - Fields[i].data.member.offset = offset; - offset += Fields[i].type->size; - } + } + const sarray GetFields(EFieldFind find, const Name& name) const { + return sarray(&Fields[0], 2); + } + static const sarray GetFields(const UClass* _cls, EFieldFind find, const Name& name) { + auto cls = static_cast(_cls); + return cls->GetFields(find, name); } }; class UClass_Container : public UClass { @@ -163,10 +210,10 @@ namespace refl { }; //container using size_impl = size_t(*)(const void*); - using to_iterator_impl = iterator(*)(const void*); + using to_iterator_impl = void(*)(iterator& ,const void*); using insert_impl = void (*)(const void*, const void*); //iterator - using iterator_impl = void* (*)(const void*); + using iterator_impl = void (*)(iterator*); public: size_impl vsize; to_iterator_impl vbegin; @@ -189,8 +236,6 @@ namespace refl { class UClass_Container_impl : public UClass_Container { using UClass_Container::UClass_Container; using MyUClass = UClass_Container_impl; - using ToIteratorFunc = T::iterator(T::*)(); - using IteratorFunc = T::iterator& (T::iterator::*)(); public: static bool construct(void* ptr, const UClass* cls, const sarray& ArgsList) { new(ptr)T(); @@ -199,13 +244,25 @@ namespace refl { static void destruct(void* ptr) { ((T*)ptr)->~T(); } - static iterator begin(const void* ptr) { + static void begin(iterator& pit,const void* ptr) { auto it = ((T*)ptr)->begin(); - return iterator{ *(void**)&it, &*it}; + memcpy(&pit, &it, sizeof(it)); + pit.val = &*it; } - static iterator end(const void* ptr) { + static void end(iterator& pit, const void* ptr) { auto it = ((T*)ptr)->end(); - return iterator{ *(void**)&it, &*it }; + memcpy(&pit, &it, sizeof(it)); + pit.val = &*it; + } + static void add(iterator* pit) { + auto it = ++(*(T::iterator*)pit); + memcpy(pit, &it, sizeof(it)); + pit->val = &*it; + } + static void sub(iterator* pit) { + auto it = --(*(T::iterator*)pit); + memcpy(pit, &it, sizeof(it)); + pit->val = &*it; } UClass_Container_impl() : UClass_Container(type_name().View(), sizeof(T)) { parent = &TypeInfo::StaticClass; @@ -225,10 +282,8 @@ namespace refl { vend = &MyUClass::end; vinsert = &MyUClass::insert; - IteratorFunc __it_add = &T::iterator::operator++; - viterator_add = *(iterator_impl*)&__it_add; - IteratorFunc __it_sub = &T::iterator::operator++; - viterator_sub = *(iterator_impl*)&__it_sub; + viterator_add = &MyUClass::add; + viterator_sub = &MyUClass::sub; }; }; template @@ -330,9 +385,9 @@ namespace refl { using MyUClass = UClass_Tuple; inline static MyUClass StaticClass = MyUClass(); }; - template - struct TypeInfoImpl> { - using MyUClass = UClass_Tuple; + template + struct TypeInfoImpl> { + using MyUClass = UClass_Pair; inline static MyUClass StaticClass = MyUClass(); }; template diff --git a/engine/3rdparty/zlib/include/yaml/serialize/register.inl b/engine/3rdparty/zlib/include/yaml/serialize/register.inl index b15f09f..97ddd8f 100644 --- a/engine/3rdparty/zlib/include/yaml/serialize/register.inl +++ b/engine/3rdparty/zlib/include/yaml/serialize/register.inl @@ -1,4 +1,5 @@ #ifdef RegisterAny + RegisterAny(string); RegisterAny(int); RegisterAny(unsigned int); RegisterAny(short); diff --git a/engine/3rdparty/zlib/test/yaml/main.cpp b/engine/3rdparty/zlib/test/yaml/main.cpp index 24f43b6..6dd03a6 100644 --- a/engine/3rdparty/zlib/test/yaml/main.cpp +++ b/engine/3rdparty/zlib/test/yaml/main.cpp @@ -32,21 +32,6 @@ void testTuple() { table.insert(std::make_pair(111,"hello")); table.insert(std::make_pair(222, "world")); using T = std::map; - using to_iterator_func = T::iterator(T::*)(); - struct myiterator { - void* ptr; - }; - using to_iterator_impl1 = myiterator*(*)(void *); - using to_iterator_impl2 = myiterator(*)(void*); - using to_iterator_impl3 = void*(*)(void*); - using to_iterator_impl4 = T::iterator(*)(T*); - auto it = table.begin(); - auto t = &*it; - to_iterator_func func = &T::begin; - to_iterator_impl1 impl1 = *(to_iterator_impl1*) & func; - to_iterator_impl2 impl2 = *(to_iterator_impl2*)&func; - to_iterator_impl3 impl3 = *(to_iterator_impl3*)&func; - to_iterator_impl4 impl4 = *(to_iterator_impl4*)&func; string rtable = YAML::Text_Serialize(table); std::cout << rtable << std::endl; auto table2 = YAML::Text_Unserialize>(rtable); @@ -60,20 +45,8 @@ int main() { constexpr bool m1 = refl::is_map_v>; constexpr bool m2 = refl::is_sequence_v>; auto cls = &TypeInfo::StaticClass; - std::vector vi; - using T = std::vector; - using iterator = T::iterator; - struct myiterator { - void* ptr; - }; - using to_iterator_impl_func = myiterator*(*)(const void*); - using to_iterator_func = void(T::*)(T::value_type&&); - to_iterator_func to_iterator = &T::push_back; - to_iterator_impl_func to_iterator_impl = * (to_iterator_impl_func*) &to_iterator; - iterator it = vi.begin(); - void* pptr = it._Ptr; - //testGuid(); - //testMeta(); + testGuid(); + testMeta(); testTuple(); return 0; } \ No newline at end of file