Advertisement
Guest User

Untitled

a guest
Apr 15th, 2019
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <util/MacroUtils.h>
  4.  
  5. #define ENUMERATE_ALL_COMPONENT_EVENTS(A)\
  6.     A(earliest_update)\
  7.     A(early_update)\
  8.     A(update)\
  9.     A(late_update)\
  10.     A(always_update)\
  11.     A(latest_update)\
  12.     A(early_unlocked_update)\
  13.     A(unlocked_update)\
  14.     A(late_unlocked_update)\
  15.     A(prerender)\
  16.     A(render_event)\
  17.     A(debug_render_event)\
  18.     A(postrender)\
  19.  
  20.  
  21. namespace glaiel {
  22.     template <typename T>     \
  23.     class ComponentInfo {     \
  24.  
  25.     };
  26.  
  27.     #define IMPL_CLASSINFO(classname, basename, classid)      \
  28.     template <>                                               \
  29.     class ComponentInfo<classname> {                          \
  30.     public:                                                   \
  31.         static constexpr const char* const name = #classname; \
  32.         static constexpr int id = classid;                    \
  33.         typedef basename base;                                \
  34.     }
  35.  
  36.     template <typename SELF, typename BASE>
  37.     class DeriveComponentWithBoilerplate : public BASE {
  38.     public:
  39.         using self = SELF;
  40.         using super = BASE;
  41.         using BASE::BASE;
  42.  
  43.         static int Type() {
  44.             return ComponentInfo<self>::id;
  45.         }
  46.         static std::string TypeSTR() {
  47.             return ComponentInfo<self>::name;
  48.         }
  49.         virtual std::string GetObjectTypeSTR() const {
  50.             return TypeSTR();
  51.         }
  52.         virtual int GetObjectType() const {
  53.             return Type();
  54.         }
  55.         static std::vector<int> Hierarchy() {
  56.             std::vector<int> a = super::Hierarchy();
  57.             a.push_back(Type());
  58.             return a;
  59.         }
  60.         virtual const std::vector<int>& GetObjectHierarchy() const {
  61.             static std::vector<int> hierarchy = Hierarchy();
  62.             return hierarchy;
  63.         }
  64.  
  65.         #define REFLECT_OVERRIDE(f) virtual bool overrides_##f() const { return IS_OVERRIDDEN(Component, self, f); }
  66.         ENUMERATE_ALL_COMPONENT_EVENTS(REFLECT_OVERRIDE);
  67.         #undef REFLECT_OVERRIDE
  68.     };
  69.  
  70.     #define COMPONENT(...) EXPAND_VARGS(OVERLOAD_MACRO2(__VA_ARGS__, _MCOMP2, _MCOMP1)(__VA_ARGS__))
  71.  
  72.     #define _MCOMP1(classname) _MCOMP2(classname, Component)
  73.  
  74.     #define _MCOMP2(classname, baseclass)                                \
  75.         class classname;                                                 \
  76.         IMPL_CLASSINFO(classname, baseclass, ComponentType::classname);  \
  77.         class classname : public DeriveComponentWithBoilerplate<classname, baseclass>      
  78.  
  79.  
  80.     #define CORE_COMPONENT(classname, baseclass)                             \
  81.         class classname;                                                     \
  82.         IMPL_CLASSINFO(classname, baseclass, CoreComponentType::classname);  \
  83.         class classname : public DeriveComponentWithBoilerplate<classname, baseclass>
  84.  
  85.     class Component;
  86.     template <>                                              
  87.     class ComponentInfo<Component> {                              
  88.     public:                                                  
  89.         static constexpr const char* const name = "Component";
  90.         static constexpr int id = CoreComponentType::Component;                                                
  91.     };
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement