This commit is contained in:
ouczbs 2024-06-25 22:05:19 +08:00
parent 87f2eb7708
commit 2120ebb7d2
5 changed files with 19 additions and 9 deletions

View File

@ -14,7 +14,15 @@ namespace refl {
void destruct() { void destruct() {
cls->Destruct((void*)ptr); cls->Destruct((void*)ptr);
} }
Any malloc_any() { void try_free(const Any& any, int size) {
if (any.cls == cls->parent && any.Size() > size) {
free((void*)any.ptr);
}
}
Any try_malloc(void* memory, int size) {
if (cls->parent->size <= size) {
return { memory, cls->parent };
}
void* ptr = malloc(cls->parent->size); void* ptr = malloc(cls->parent->size);
return { ptr, cls->parent }; return { ptr, cls->parent };
} }

View File

@ -154,7 +154,7 @@ namespace refl {
template<typename First,typename Second> template<typename First,typename Second>
class UClass_Pair : public UClass { class UClass_Pair : public UClass {
using UClass::UClass; using UClass::UClass;
using MyUClass = UClass_Tuple<First, Second>; using MyUClass = UClass_Pair<First, Second>;
using MyPair = std::pair<First, Second>; using MyPair = std::pair<First, Second>;
public: public:
std::array<FieldPtr, 2> Fields; std::array<FieldPtr, 2> Fields;

View File

@ -95,13 +95,14 @@ namespace YAML
if (res.IsSequence() && any.IsContainer()) { if (res.IsSequence() && any.IsContainer()) {
auto docker = any.ToContainer(); auto docker = any.ToContainer();
docker.construct(); docker.construct();
Any any = docker.malloc_any(); char memory[STACK_MEMORY_SIZE];
Any any = docker.try_malloc(&memory, STACK_MEMORY_SIZE);
for (std::size_t i = 0; i < res.size(); i++) { for (std::size_t i = 0; i < res.size(); i++) {
Unserialize(res[i], any); Unserialize(res[i], any);
docker.insert(any); docker.insert(any);
any.Destruct(); any.Destruct();
} }
free((void*)any.ptr); docker.try_free(any, STACK_MEMORY_SIZE);
return true; return true;
} }
if (res.IsSequence() && any.IsArray()) { if (res.IsSequence() && any.IsArray()) {

View File

@ -20,5 +20,5 @@ namespace YAML
{ static_cast<std::string>(t) } -> std::convertible_to<std::string>; { static_cast<std::string>(t) } -> std::convertible_to<std::string>;
}; };
#pragma endregion ToString #pragma endregion ToString
#define STACK_MEMORY_SIZE 128
} }

View File

@ -24,20 +24,21 @@ void testMeta() {
auto rmb2 = YAML::Text_Unserialize<MetaBundle>(rmb1); auto rmb2 = YAML::Text_Unserialize<MetaBundle>(rmb1);
if (rmb2) { if (rmb2) {
MetaBundle aa = rmb2.value(); MetaBundle aa = rmb2.value();
std::cout << "success!" << std::endl; std::cout << "success!\n" << YAML::Text_Serialize(aa) << std::endl;
} }
} }
void testTuple() { void testTuple() {
std::map<int, string> table; std::map<int, string> table;
table.insert(std::make_pair(111,"hello")); table.insert(std::make_pair(111,"hello\nworld!!"));
table.insert(std::make_pair(222, "world")); table.insert(std::make_pair(222, "yaml\n????"));
table.insert(std::make_pair(333, YAML::Text_Serialize(table)));
using T = std::map<int, string>; using T = std::map<int, string>;
string rtable = YAML::Text_Serialize(table); string rtable = YAML::Text_Serialize(table);
std::cout << rtable << std::endl; std::cout << rtable << std::endl;
auto table2 = YAML::Text_Unserialize<std::map<int, string>>(rtable); auto table2 = YAML::Text_Unserialize<std::map<int, string>>(rtable);
if (table2) { if (table2) {
std::map<int, string> aa = table2.value(); std::map<int, string> aa = table2.value();
std::cout << "success!" << std::endl; std::cout << "success!\n" << YAML::Text_Serialize(aa) << std::endl;
} }
} }
using size_impl = size_t(*)(const void*); using size_impl = size_t(*)(const void*);