From 458a24b4c672c87c3a961a3d0610dd7f2d783d5c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 22 Dec 2022 09:10:47 +0800 Subject: [PATCH] 1 --- f8/utils.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/f8/utils.h b/f8/utils.h index 583a9d1..4ac1423 100644 --- a/f8/utils.h +++ b/f8/utils.h @@ -1,5 +1,9 @@ #pragma once +#include +#include +#include + namespace google { namespace protobuf @@ -44,6 +48,64 @@ namespace f8 }); } + template + bool ReadCsvMetaFile(const std::string& filename, std::vector& meta_list) + { + T dummy; + a8::reflect::Class* cls = dummy.GetClass(); + + a8::CsvReader reader; + reader.Load(filename); + while (reader.NextLine()) { + a8::reflect::Field* fields = cls->GetDeclaredFields(); + for (int i = 0; i < cls->FieldNum(); ++i) { + a8::reflect::Field& field = fields[i]; + if (field.subtype != a8::reflect::EST_SIMPLE) { + abort(); + } + T* obj = new T(); + void* p = (void*)obj + field.offset; + switch (field.type) { + case a8::reflect::ET_INT32: + { + *((int*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_UINT32: + { + *((unsigned int*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_INT64: + { + *((long long*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_FLOAT: + { + *((float*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_DOUBLE: + { + *((double*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_STRING: + { + *((std::string*)p) = reader.GetValue(field.field_name).GetString(); + } + break; + default: + { + abort(); + } + } + meta_list.push_back(obj); + } + } + } + bool ReadJsonMetaFile(const std::string& filename, google::protobuf::Message* prototype, std::function push_back_func);