📄 class.cpp
字号:
#include <string.h>
#include <stdlib.h>
#include "reflect.h"
RTTIFieldDescriptor* RTTIClassDescriptor::findField(char const* name)
{
int l = 0, r = nFields;
while (l < r) {
int i = (l + r) >> 1;
if (strcmp(name, fields[i]->name) > 0) {
l = i+1;
} else {
r = i;
}
}
if (r < nFields && strcmp(fields[r]->name, name) == 0) {
return fields[r];
}
return NULL;
}
static int cmpFields(const void* p, const void* q) {
return strcmp((*(RTTIFieldDescriptor**)p)->getName(), (*(RTTIFieldDescriptor**)q)->getName());
}
static int cmpMethods(const void* p, const void* q) {
return strcmp((*(RTTIMethodDescriptor**)p)->getName(), (*(RTTIMethodDescriptor**)q)->getName());
}
RTTIClassDescriptor::RTTIClassDescriptor(char const* name, int size,
RTTIDescribeFieldsFunc describeFieldsFunc,
RTTIDescribeMethodsFunc describeMethodsFunc,
RTTICreateInstanceFunc createInstanceFunc,
int flags)
: RTTIType(RTTI_STRUCT)
{
this->name = name;
this->size = size;
this->defaultConstructor = NULL;
this->createInstanceFunc = createInstanceFunc;
this->flags = flags;
fieldList = (*describeFieldsFunc)();
methodList = (*describeMethodsFunc)();
buildClassDescriptor();
RTTIRepository* repo = RTTIRepository::getInstance();
repo->addClass(this);
}
void* RTTIClassDescriptor::newInstance()
{
if (createInstanceFunc) {
return (*createInstanceFunc)();
} else {
void* p = new char[size];
(*defaultConstructor)(p);
return p;
}
}
RTTIClassDescriptor::RTTIClassDescriptor(char const* name, int size, int flags)
: RTTIType(RTTI_STRUCT)
{
this->name = name;
this->size = size;
this->defaultConstructor = NULL;
this->createInstanceFunc = NULL;
this->flags = flags;
this->fieldList = NULL;
this->methodList = NULL;
initialized = false;
}
void RTTIClassDescriptor::buildClassDescriptor()
{
int i, n, nb;
RTTIFieldDescriptor *fd;
RTTIMethodDescriptor* md;
for (fd = fieldList, n = 0, nb = 0; fd != NULL; fd = fd->next) {
n += 1;
fd->declaringClass = this;
if (fd->type != NULL && fd->type->tag == RTTI_DERIVED) {
nb += 1;
}
}
nBaseClasses = nb;
baseClasses = new RTTIClassDescriptor*[nb];
fields = new RTTIFieldDescriptor*[n];
nFields = n;
for (fd = fieldList, n = 0, nb = 0; fd != NULL; fd = fd->next) {
fields[n++] = fd;
if (fd->type != NULL && fd->type->tag == RTTI_DERIVED) {
baseClasses[nb++] = ((RTTIDerivedType*)fd->type)->getBaseClass();
}
}
qsort(fields, n, sizeof(RTTIFieldDescriptor*), cmpFields);
for (i = 0; i < n; i++) {
fields[i]->index = i;
}
for (n = 0, md = methodList; md != NULL; md = md->next) {
n += 1;
}
nMethods = n;
methods = new RTTIMethodDescriptor*[n];
for (n = 0, md = methodList; md != NULL; md = md->next) {
methods[n++] = md;
}
qsort(methods, n, sizeof(RTTIMethodDescriptor*), cmpMethods);
for (i = 0; i < n; i++) {
methods[i]->index = i;
}
initialized = true;
}
void RTTIClassDescriptor::getTypeName(char* buf)
{
strcpy(buf, name);
}
RTTIMethodDescriptor* RTTIClassDescriptor::findMethod(char const* name)
{
int l = 0, r = nMethods;
while (l < r) {
int i = (l + r) >> 1;
if (strcmp(name, methods[i]->name) > 0) {
l = i+1;
} else {
r = i;
}
}
if (r < nMethods && strcmp(methods[r]->name, name) == 0) {
return methods[r];
}
return NULL;
}
RTTIClassDescriptor::~RTTIClassDescriptor()
{
delete[] baseClasses;
delete[] methods;
delete[] fields;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -