#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()))
// {
// //遍歷給與單獨給一樣
// }
//}