]> git.tdb.fi Git - libs/game.git/commitdiff
Allow reflection to detect polymorphic bases from a type alias
authorMikko Rasa <tdb@tdb.fi>
Sat, 27 Jan 2024 08:59:11 +0000 (10:59 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 27 Jan 2024 08:59:11 +0000 (10:59 +0200)
source/game/component.h
source/game/director.cpp
source/game/entity.h
source/game/reflection.h

index e97b511a6ed658edbc9c221b2ca14a7ffa2927f7..b81251df983639213d15a7b205d2c2adda4efcf1 100644 (file)
@@ -12,6 +12,9 @@ class Entity;
 
 class MSPGAME_API Component
 {
+public:
+       using PolymorphicBase = Component;
+
 protected:
        Handle<Entity> entity;
 
index 410aa0aa936553b664f71c69554028613901dc49..eedc4d5befe0c16c321cf5c99c1a81c3ce52d1d5 100644 (file)
@@ -19,8 +19,8 @@ Director::Director(DataFile::Collection &r):
        access_guard.emplace();
 #endif
 
-       reflector.get_or_create_class<Entity>().set_polymorphic_base<Entity>();
-       reflector.get_or_create_class<Component>().set_polymorphic_base<Component>();
+       reflector.get_or_create_class<Entity>();
+       reflector.get_or_create_class<Component>();
 }
 
 // Hide ~unique_ptr<Stage> from the header
index e6d1cf940cd8da44783976a29fd1ce407cf01770..a8daba8ec602129a6f2b7455e9f29f4c6ea52605 100644 (file)
@@ -21,6 +21,8 @@ public:
 class MSPGAME_API Entity
 {
 public:
+       using PolymorphicBase = Entity;
+
        enum TransformTag { NO_TRANSFORM };
 
 private:
index 49d4ee22802f783201cbd2cd835d2d48d5c3b9ae..be4b0b6cbd57a94f83200f045fbb0f3aac7145f8 100644 (file)
@@ -76,7 +76,7 @@ template<typename T>
 class Class: public ClassBase
 {
 public:
-       Class(Reflector &r): ClassBase(r, typeid(T)) { }
+       Class(Reflector &);
 
        template<typename B>
        void set_polymorphic_base();
@@ -171,6 +171,14 @@ inline void ClassBase::increment_generation() const
 }
 
 
+template<typename T>
+Class<T>::Class(Reflector &r):
+       ClassBase(r, typeid(T))
+{
+       if constexpr(requires { typename T::PolymorphicBase; })
+               set_polymorphic_base<typename T::PolymorphicBase>();
+}
+
 template<typename T>
 template<typename B>
 inline void Class<T>::set_polymorphic_base()