反射-C++屬性反射簡單實現

#pragma once

#include "preconfig.h" 
#include "object.h"
#include "any.h"
#include "configuration.h"
#include <iostream>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <cassert>
#include <unordered_map>
#include <cmath>
using namespace UTILITY_NAME;


struct GS_API GsProperty
{
	 GsString  MemberName ="";
	 GsVarType MemberType = eUnknownVarType;
	 bool IsWriteable = true;
	 GsProperty(GsString strMemerName, GsVarType eType, bool bIsReadable)
	 {
		 MemberName = strMemerName;
		 MemberType = eType;
		 IsWriteable = bIsReadable;
	 }
};


class GS_API GsMetaObject
{
protected:
	GsString m_strClassName;
	GsVector<GsProperty> m_Members;
public:

	int PropertyCount()
	{
		InitMeta();
		return m_Members.size();
	}

	GsProperty PropertyMeta(int index)
	{
		InitMeta();
		return m_Members[index];
	}
	const GsVector<GsProperty>* Propertys()
	{
		InitMeta();
		return &m_Members;
	}
	//設置和取值
	virtual bool Property(const char *strName, const GsAny &value)
	{
		return false;
	}
	virtual GsAny Property(const char *name) const
	{
		return GsAny();
	}

	virtual void InvokeMethod(const char *name, ...)
	{

	}
	//初始化列表
	virtual void InitMeta()
	{

	}
};


//#ifndef GS_VarTypeValueName
//
//const char * VarTypeValueName(GsVarType eType)
//{
//	switch (eType)
//	{
//	case GeoStar::Utility::eUnknownVarType:
//		return 0;
//	case GeoStar::Utility::eEmpty:
//		return 0;
//	case GeoStar::Utility::eI1:
//		return "cVal";
//	case GeoStar::Utility::eI2:
//		return "sVal";
//	case GeoStar::Utility::eI4:
//		return "iVal";
//	case GeoStar::Utility::eI8:
//		return  "llVal";
//	case GeoStar::Utility::eUI1:
//		return"ucVal";
//	case GeoStar::Utility::eUI2:
//		return "usVal";
//	case GeoStar::Utility::eUI4:
//		return "uiVal";
//	case GeoStar::Utility::eUI8:
//		return  "ullVal";
//	case GeoStar::Utility::eR4:
//		return "fltVal";
//	case GeoStar::Utility::eR8:
//		return "dblVal";
//	case GeoStar::Utility::eString:
//		return "strVal";
//	case GeoStar::Utility::eBool:
//		return "boolVal";
//	case GeoStar::Utility::eObject:
//		return "objVal";
//	case GeoStar::Utility::eBlob:
//		return "objVal";
//	case GeoStar::Utility::eDateTime:
//		return "blbVal";
//	default:
//		break;
//	}
//	return "";
//}
//#define GS_VarTypeValueName(eType) VarTypeValueName(eType)
//
//
//#endif // GS_VarTypeValueName

#define GSANYVARTYPE_RETURN(eVarType) 

#define GS_METAOBJECT_BEGIN(mySymbol) public:\
										virtual void InitMeta()\
										{\
											if (m_Members.size() > 0)\
												return; \
											m_strClassName = #mySymbol;
#define GS_PROPERTY_INIT_BEGIN
#define GS_PROPERTY_INIT(ID, val,B)			m_Members.emplace_back(#ID, val, B);
#define GS_PROPERTY_INIT_END			}		

#define GS_PROPERTY_SET_BEGIN	virtual bool Property(const char *strName, const GsAny &value)\
								{\
									if (!this)\
									return false;\

#define GS_PROPERTY_SET(ID, eVarType)  if (#ID == strName)\
									   {\
											this->ID(value);\
									   }
#define GS_PROPERTY_SET_END		return true;}


#define GS_PROPERTY_GET_BEGIN 	virtual GsAny Property(const char *name) \
								{\
									InitMeta();\
									if (!this)\
										return false;
#define GS_PROPERTY_GET(ID, GsVarType)	if (#ID == name)\
										{\
											return this->ID();\
										}
#define GS_PROPERTY_GET_END		return GsAny();}
#define GS_METAOBJECT_END




#define GS_PROPERTY_TEMPLATE_0(mySymbolTest)\
			GS_METAOBJECT_BEGIN(mySymbolTest) \
			GS_PROPERTY_INIT_BEGIN \
			GS_PROPERTY_INIT_END \
			GS_PROPERTY_SET_BEGIN \
			GS_PROPERTY_SET_END \
			GS_PROPERTY_GET_BEGIN \
			GS_PROPERTY_GET_END\
			GS_METAOBJECT_END

#define  GS_PROPERTY_TEMPLATE_1(mySymbolTest,ID,eI4,b1)\
			GS_METAOBJECT_BEGIN(mySymbolTest) \
			GS_PROPERTY_INIT_BEGIN \
			GS_PROPERTY_INIT(ID, eI4, b1) \
			GS_PROPERTY_INIT_END \
			GS_PROPERTY_SET_BEGIN \
			GS_PROPERTY_SET(ID, eI4)\
			GS_PROPERTY_SET_END \
			GS_PROPERTY_GET_BEGIN \
			GS_PROPERTY_GET(ID, eI4) \
			GS_PROPERTY_GET_END\
			GS_METAOBJECT_END

//2個屬性
#define  GS_PROPERTY_TEMPLATE_2(mySymbolTest,ID,eI4,b1,\
								HeightField,eString,b2)\
			GS_METAOBJECT_BEGIN(mySymbolTest) \
			GS_PROPERTY_INIT_BEGIN \
			GS_PROPERTY_INIT(ID, eI4, b1) \
			GS_PROPERTY_INIT(HeightField, eString, b2) \
			GS_PROPERTY_INIT_END \
			GS_PROPERTY_SET_BEGIN \
			GS_PROPERTY_SET(ID, eI4)\
			GS_PROPERTY_SET(HeightField, eString) \
			GS_PROPERTY_SET_END \
			GS_PROPERTY_GET_BEGIN \
			GS_PROPERTY_GET(ID, eI4) \
			GS_PROPERTY_GET(HeightField, eString)\
			GS_PROPERTY_GET_END\
			GS_METAOBJECT_END

#define  GS_PROPERTY_TEMPLATE_3(mySymbolTest,a10,a11,a12,\
											a20,a21,a22,\
											a30, a31, a32)\
			GS_METAOBJECT_BEGIN(mySymbolTest) \
			GS_PROPERTY_INIT_BEGIN \
			GS_PROPERTY_INIT(ID, eI4, b1) \
			GS_PROPERTY_INIT(HeightField, eString, b2) \
			GS_PROPERTY_INIT(a30, a31, a32)\
			GS_PROPERTY_INIT_END \
			GS_PROPERTY_SET_BEGIN \
			GS_PROPERTY_SET(ID, eI4)\
			GS_PROPERTY_SET(HeightField, eString) \
			GS_PROPERTY_SET(a30, a31)\
			GS_PROPERTY_SET_END \
			GS_PROPERTY_GET_BEGIN \
			GS_PROPERTY_GET(ID, eI4) \
			GS_PROPERTY_GET(HeightField, eString)\
			GS_PROPERTY_GET(a30, a31)\
			GS_PROPERTY_GET_END\
			GS_METAOBJECT_END

#define FL_ARG_COUNT(...) FL_INTERNAL_ARG_COUNT_PRIVATE(0, ##__VA_ARGS__,\
	64, 63, 62, 61, 60, \
	59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
	49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
	39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
	29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
	19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
	 9,  8,  7,  6,  5,  4,  3,  2,  1,  0)
#define FL_INTERNAL_ARG_COUNT_PRIVATE(\
	 _0,  _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, \
	_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \
	_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \
	_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \
	_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \
	_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \
	_60, _61, _62, _63, _64, N, ...) N







class GS_API mySymbolTest : public GsMetaObject
{
protected:
	int m_ID = 0;
	GsString m_strHeightField;
public:
	int ID()
	{
		return m_ID;
	}
	void ID(int ID)
	{
		m_ID = ID;
	}
	GsString HeightField()
	{
		return m_strHeightField;
	}
	void HeightField(const GsString& str)
	{
		m_strHeightField = str;
	}


	GS_PROPERTY_TEMPLATE_1(
		mySymbolTest,
		ID, eI4, true
		)
};


	//GS_TEST(GsReflectObject, GsReflectObject, chijing, 20200617)
	//{
	//	mySymbolTest bn;
	//	bn.ID(123);
	//	int tn = bn.Property("ID");
	//	bn.Property("ID", 1234);
	//	tn = bn.Property("ID");
	//	GsProperty prop = bn.PropertyMeta(0);
	//	for (auto &member : (*bn.Propertys()))
	//	{
	//		//遍歷給與單獨給一樣
	//	}
	//}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章