//<Part.六> 类成员元数据结构
//用于说明成员声明方式是单个还是数组:TYPE * id/vector<TYPE *> * id
enum MemberDefineCategory {
MemberDefineCategory_Undefine = 0,//未确定类型
MemberDefineCategory_Single = 1,//以TYPE * id方式单个定义的成员
MemberDefineCategory_Array = 2 //以vector<TYPE *> * id方式数组定义的成员
};
//内存控制类型,用于管理内存的回收
enum MemoryCtrlType {
MemoryCtrlType_Reference = 1,//仅引用指针,不会复制不会删除
MemoryCtrlType_Handover = 2,//交接内存,不会复制但会删除
MemoryCtrlType_DeepCopy = 3//深度复制,会复制且会删除
};
//JSON类的成员变量信息
class jsonObjectMemberInfo {
public:
//类成员定义元数据
string metaName;//成员名称
string metaType;//数据类型--任何时候均为原子数据类型或者JSON子类名,这里是不带vector、不带*的。
int metaSortOrder;//声明顺序
MemberDefineCategory metaCate;//成员定义类别:单个还是数组
//下面用于设置成员值
void* ptrInputData;//内存指针,用于设置成员值时传递入参
MemoryCtrlType inputDataCtrlType;//设置值时带上ptrData的内存控制方式,来自上述的enum MemoryCtrlType
MemberDefineCategory inputDataCate;//入参类别:单个还是数组
//当前操作的类对象
jsonObjectBaseClass* ptrOwnObj;//此成员所归属的JSON对象
//构造函数
jsonObjectMemberInfo();
jsonObjectMemberInfo(const jsonObjectMemberInfo& e);
jsonObjectMemberInfo& operator=(const jsonObjectMemberInfo& e);
//创建一个metaType类型的JSON对象,如果它是JSON子类
jsonObjectBaseClass* createMemberObject();
/*返回成员指针TYPE * ID/<vector *> * ID的地址,即 &ID */
template<class T>
T** getMemPtrAddr() {
assert(ptrOwnObj);
assert(metaSortOrder >= 0);
//JSON对象的成员固定排列
return (T**)((char*)ptrOwnObj + sizeof(greenInt*) + sizeof(memoryGarbageCollector) + sizeof(greenInt*) * metaSortOrder);
}
template<class F>
F getMemAccessFunc() {
assert(ptrOwnObj);
assert(metaSortOrder >= 0);
/*虚函数表格:前面cntBaseVirtualFunc个为基类多态接口,之后依次为各成员变量的access方法*/\
greenInt** pVirtualTable = (greenInt**)*(greenInt*)(ptrOwnObj);
/*将虚函数转化为类成员函数地址*/
int offset = 0;
#if !((defined WIN32) || (defined WIN64))
++offset;//g++的虚表会把每个类的~className()都放到虚函数表中
#endif
F pFun = (F) * (F*)(pVirtualTable + metaSortOrder + offset + jsonObjectBaseClass::cntBaseVirtualFunc);
return pFun;
}
/*返回内存回收器的地址,即 &memGarbage */
memoryGarbageCollector& getMemGarbage() {
assert(ptrOwnObj);
return *(memoryGarbageCollector*)((char*)ptrOwnObj + sizeof(greenInt*));
}
//把JSON对象设置到Member的值
void inputData2Member(void* ptr, MemoryCtrlType ptrctrl, MemberDefineCategory mdc);
//用于数据设置到Member
void inputData2Member(jsonStringParser* parser);
//此成员的type类型是否JSON类
bool isJsonClass();
//是否假成员:用于不存在的JSON节点解析
bool isFake() {
return metaType.empty();//假类型没有数据类型
}
void setFake() {
metaCate = MemberDefineCategory_Undefine;
metaName.clear();
metaType.clear();
}
void printInfo() {
LOG4J_INFO("metaName:%s,metaType:%s,metaCate:%d,metaSortOrder:%d", metaName.c_str(), metaType.c_str(), metaCate, metaSortOrder);
}
};