1
This commit is contained in:
parent
cea561b5ae
commit
03705ca2dc
31
f8/utils.h
31
f8/utils.h
@ -2,7 +2,7 @@
|
||||
|
||||
#include <a8/reflect.h>
|
||||
#include <a8/stringlist.h>
|
||||
#include <a8/csvreader.h>
|
||||
#include <a8/xobject.h>
|
||||
|
||||
namespace a8
|
||||
{
|
||||
@ -17,52 +17,53 @@ namespace f8
|
||||
{
|
||||
|
||||
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;
|
||||
a8::reflect::Class* cls = dummy.GetClass();
|
||||
|
||||
a8::CsvReader reader;
|
||||
reader.Load(filename);
|
||||
while (reader.NextLine()) {
|
||||
a8::XObject xobj_arr;
|
||||
xobj_arr.ReadFromFile(filename);
|
||||
for (int i = 0; i < xobj_arr.Size(); ++i) {
|
||||
T* obj = new T();
|
||||
a8::reflect::Field* fields = cls->GetDeclaredFields();
|
||||
for (int i = 0; i < cls->FieldNum(); ++i) {
|
||||
a8::reflect::Field& field = fields[i];
|
||||
for (int ii = 0; ii < cls->FieldNum(); ++ii) {
|
||||
a8::reflect::Field& field = fields[ii];
|
||||
if (field.subtype != a8::reflect::EST_SIMPLE) {
|
||||
abort();
|
||||
}
|
||||
auto xobj = xobj_arr.At(i);
|
||||
void* p = (char*)obj + field.offset;
|
||||
if (reader.KeyExists(field.field_name)) {
|
||||
if (xobj->HasKey(field.field_name)) {
|
||||
switch (field.type) {
|
||||
case a8::reflect::ET_INT32:
|
||||
{
|
||||
*((int*)p) = reader.GetValue(field.field_name);
|
||||
*((int*)p) = xobj->At(field.field_name)->AsXValue();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_UINT32:
|
||||
{
|
||||
*((unsigned int*)p) = reader.GetValue(field.field_name);
|
||||
*((unsigned int*)p) = xobj->At(field.field_name)->AsXValue();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_INT64:
|
||||
{
|
||||
*((long long*)p) = reader.GetValue(field.field_name);
|
||||
*((long long*)p) = xobj->At(field.field_name)->AsXValue();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_FLOAT:
|
||||
{
|
||||
*((float*)p) = reader.GetValue(field.field_name).GetDouble();
|
||||
*((float*)p) = xobj->At(field.field_name)->AsXValue().GetDouble();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_DOUBLE:
|
||||
{
|
||||
*((double*)p) = reader.GetValue(field.field_name);
|
||||
*((double*)p) = xobj->At(field.field_name)->AsXValue();
|
||||
}
|
||||
break;
|
||||
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;
|
||||
default:
|
||||
@ -70,7 +71,7 @@ namespace f8
|
||||
abort();
|
||||
}
|
||||
}
|
||||
obj->__flags__.set(i);
|
||||
obj->__flags__.set(ii);
|
||||
}
|
||||
}
|
||||
meta_list.push_back(obj);
|
||||
|
Loading…
x
Reference in New Issue
Block a user