greenJson_C++_Lib 之六:定义JSON类成员的元数据结构

//<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);
	}
};
发布了11 篇原创文章 · 获赞 1 · 访问量 301

猜你喜欢

转载自blog.csdn.net/u011697262/article/details/103940818
今日推荐