1
This commit is contained in:
parent
b69451720a
commit
11f2866ade
158
a8/reflect.cc
Normal file
158
a8/reflect.cc
Normal file
@ -0,0 +1,158 @@
|
||||
#include <a8/a8.h>
|
||||
|
||||
#include <a8/reflect.h>
|
||||
#include <a8/xvalue.h>
|
||||
|
||||
namespace a8
|
||||
{
|
||||
|
||||
namespace reflect {
|
||||
a8::reflect::Field* Class::GetFieldByName(const std::string& name)
|
||||
{
|
||||
for (int i = 0; i < FieldNum(); ++i) {
|
||||
if (name == fields_[i].field_name) {
|
||||
return &fields_[i];
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
long long Class::GetFieldValueAsInt64(a8::reflect::Field* field, char* p)
|
||||
{
|
||||
switch (field->type) {
|
||||
case a8::reflect::ET_INT32:
|
||||
{
|
||||
return *((int*)p);
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_UINT32:
|
||||
{
|
||||
return *((unsigned int*)p);
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_INT64:
|
||||
{
|
||||
return *((long long*)p);
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_FLOAT:
|
||||
{
|
||||
return *((float*)p);
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_DOUBLE:
|
||||
{
|
||||
return *((double*)p);
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_STRING:
|
||||
{
|
||||
return a8::XValue(*((std::string*)p));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string Class::GetFieldValueAsString(a8::reflect::Field* field, char* p)
|
||||
{
|
||||
switch (field->type) {
|
||||
case a8::reflect::ET_INT32:
|
||||
{
|
||||
return a8::XValue(*((int*)p)).GetString();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_UINT32:
|
||||
{
|
||||
return a8::XValue(*((unsigned int*)p)).GetString();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_INT64:
|
||||
{
|
||||
return a8::XValue(*((long long*)p)).GetString();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_FLOAT:
|
||||
{
|
||||
return a8::XValue(*((float*)p)).GetString();
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_DOUBLE:
|
||||
{
|
||||
return a8::XValue(*((double*)p));
|
||||
}
|
||||
break;
|
||||
case a8::reflect::ET_STRING:
|
||||
{
|
||||
return (*((std::string*)p));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Class::SetSimpleField(
|
||||
int fieldidx,
|
||||
const char* fieldname,
|
||||
int type,
|
||||
int offset
|
||||
)
|
||||
{
|
||||
SetField(fieldidx,
|
||||
fieldname,
|
||||
type,
|
||||
a8::reflect::EST_SIMPLE,
|
||||
offset,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr);
|
||||
}
|
||||
|
||||
void Class::SetField(int fieldidx,
|
||||
const char* fieldname,
|
||||
int type,
|
||||
int subtype,
|
||||
int offset,
|
||||
a8::reflect::Class **pp_generic_class,
|
||||
void* (*create)(),
|
||||
void (*destroy)(void*),
|
||||
int (*size)(void*),
|
||||
void (*for_each)(a8::reflect::Field*, void*, void*, FIELD_FOR_EACH_FUNC),
|
||||
char* (*push_back)(void*)
|
||||
)
|
||||
{
|
||||
a8::reflect::Field *p = fields_ + fieldidx;
|
||||
p->field_name = fieldname;
|
||||
p->type = type;
|
||||
p->subtype = subtype;
|
||||
p->offset = offset;
|
||||
p->pp_generic_class = pp_generic_class;
|
||||
p->create = create;
|
||||
p->destroy = destroy;
|
||||
p->size = size;
|
||||
p->for_each = for_each;
|
||||
p->push_back = push_back;
|
||||
}
|
||||
|
||||
|
||||
int Class::GetFieldIdx(int offset)
|
||||
{
|
||||
for (int i = 0; i < fieldnum_; i++) {
|
||||
if (fields_[i].offset == offset) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user