Created
November 11, 2024 17:33
-
-
Save Pikachuxxxx/f7c491c12ec25f85ccd5a0212c7a35a5 to your computer and use it in GitHub Desktop.
Reflection testing in C++ RTTI
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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