Skip to content

Instantly share code, notes, and snippets.

@Pikachuxxxx
Created November 11, 2024 17:33
Show Gist options
  • Save Pikachuxxxx/f7c491c12ec25f85ccd5a0212c7a35a5 to your computer and use it in GitHub Desktop.
Save Pikachuxxxx/f7c491c12ec25f85ccd5a0212c7a35a5 to your computer and use it in GitHub Desktop.
Reflection testing in C++ RTTI
#include <iostream>
#include <vector>
#include <string>
#include <typeinfo>
//----------------------------------
// Reflection System using typeid and decltype
struct MemberInfo
{
std::string name;
std::string typeName;
uint32_t offset;
uint32_t size;
};
struct TypeInfo
{
std::string name;
std::string typeName;
uint32_t size;
std::vector<MemberInfo> members;
};
#define REFLECT_TYPE_START(Type) \
{ \
using refType = Type; \
std::cout << "Reflecting Type... : " << #Type << std::endl; \
std::cout << "@typeName : " << typeid(refType).name() << std::endl; \
std::cout << "@size : " << sizeof(refType) << std::endl; \
#define REFLECT_MEMBER(Member) \
std::cout << "\t @typeName: " << typeid(decltype(((refType*)nullptr)->Member)).name() << std::endl; \
std::cout << "\t @name : " << #Member << std::endl; \
std::cout << "\t @size : " << sizeof(refType::Member) << std::endl; \
std::cout << "\t @offset : " << offsetof(refType, Member) << std::endl;
#define REFLECT_TYPE_END }
//----------------------------------
struct vec3
{
float x, y, z;
vec3(float _x, float _y, float _z)
:x(_x), y(_y), z(_z) {}
vec3()
:x(0.0f), y(0.0f), z(0.0f) {}
};
struct vec2
{
float x, y;
vec2(float _x, float _y)
:x(_x), y(_y) {}
vec2()
:x(0.0f), y(0.0f) {}
};
//----------------------------------
// Components to reflect
struct TransformComponent
{
vec3 position;
vec3 rotation;
vec3 scale;
vec2 uv_tiling;
};
struct SpriteComponent
{
vec2 position;
vec2 uv;
};
// ex. Usage
/*
REFLECT_TYPE_START(TransformComponent);
REFLECT_MEMBER(position)
REFLECT_MEMBER(rotation)
REFLECT_MEMBER(scale)
REFLECT_TYPE_END();
*/
int main(int argc, char** argv)
{
TransformComponent origin;
std::cout << "Reflecting Transform ===>" << std::endl;
std::cout << "\t @ type name : " << typeid(TransformComponent).name() << std::endl;
// clang-format off
REFLECT_TYPE_START(TransformComponent)
REFLECT_MEMBER(position)
REFLECT_MEMBER(rotation)
REFLECT_MEMBER(scale)
REFLECT_TYPE_END
REFLECT_TYPE_START(SpriteComponent)
REFLECT_MEMBER(position)
REFLECT_MEMBER(uv)
REFLECT_TYPE_END
// clang-format on
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment