This commit is contained in:
aozhiwei 2023-02-06 14:29:22 +08:00
parent cea561b5ae
commit 03705ca2dc

View File

@ -2,7 +2,7 @@
#include <a8/reflect.h> #include <a8/reflect.h>
#include <a8/stringlist.h> #include <a8/stringlist.h>
#include <a8/csvreader.h> #include <a8/xobject.h>
namespace a8 namespace a8
{ {
@ -17,52 +17,53 @@ namespace f8
{ {
template <typename T> template <typename T>
bool ReadCsvMetaFile(const std::string& filename, std::vector<T*>& meta_list) bool ReadJsonMetaFile(const std::string& filename, std::vector<T*>& meta_list)
{ {
T dummy; T dummy;
a8::reflect::Class* cls = dummy.GetClass(); a8::reflect::Class* cls = dummy.GetClass();
a8::CsvReader reader; a8::XObject xobj_arr;
reader.Load(filename); xobj_arr.ReadFromFile(filename);
while (reader.NextLine()) { for (int i = 0; i < xobj_arr.Size(); ++i) {
T* obj = new T(); T* obj = new T();
a8::reflect::Field* fields = cls->GetDeclaredFields(); a8::reflect::Field* fields = cls->GetDeclaredFields();
for (int i = 0; i < cls->FieldNum(); ++i) { for (int ii = 0; ii < cls->FieldNum(); ++ii) {
a8::reflect::Field& field = fields[i]; a8::reflect::Field& field = fields[ii];
if (field.subtype != a8::reflect::EST_SIMPLE) { if (field.subtype != a8::reflect::EST_SIMPLE) {
abort(); abort();
} }
auto xobj = xobj_arr.At(i);
void* p = (char*)obj + field.offset; void* p = (char*)obj + field.offset;
if (reader.KeyExists(field.field_name)) { if (xobj->HasKey(field.field_name)) {
switch (field.type) { switch (field.type) {
case a8::reflect::ET_INT32: case a8::reflect::ET_INT32:
{ {
*((int*)p) = reader.GetValue(field.field_name); *((int*)p) = xobj->At(field.field_name)->AsXValue();
} }
break; break;
case a8::reflect::ET_UINT32: case a8::reflect::ET_UINT32:
{ {
*((unsigned int*)p) = reader.GetValue(field.field_name); *((unsigned int*)p) = xobj->At(field.field_name)->AsXValue();
} }
break; break;
case a8::reflect::ET_INT64: case a8::reflect::ET_INT64:
{ {
*((long long*)p) = reader.GetValue(field.field_name); *((long long*)p) = xobj->At(field.field_name)->AsXValue();
} }
break; break;
case a8::reflect::ET_FLOAT: case a8::reflect::ET_FLOAT:
{ {
*((float*)p) = reader.GetValue(field.field_name).GetDouble(); *((float*)p) = xobj->At(field.field_name)->AsXValue().GetDouble();
} }
break; break;
case a8::reflect::ET_DOUBLE: case a8::reflect::ET_DOUBLE:
{ {
*((double*)p) = reader.GetValue(field.field_name); *((double*)p) = xobj->At(field.field_name)->AsXValue();
} }
break; break;
case a8::reflect::ET_STRING: case a8::reflect::ET_STRING:
{ {
*((std::string*)p) = reader.GetValue(field.field_name).GetString(); *((std::string*)p) = xobj->At(field.field_name)->AsXValue().GetString();
} }
break; break;
default: default:
@ -70,7 +71,7 @@ namespace f8
abort(); abort();
} }
} }
obj->__flags__.set(i); obj->__flags__.set(ii);
} }
} }
meta_list.push_back(obj); meta_list.push_back(obj);