]> git.tdb.fi Git - libs/game.git/commitdiff
Allow overriding the base class of BufferedComponent
authorMikko Rasa <tdb@tdb.fi>
Tue, 15 Apr 2025 21:50:57 +0000 (00:50 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 15 Apr 2025 21:51:47 +0000 (00:51 +0300)
It still has to ultimately derive from Component, but this allows
inserting an intermediate base class.

source/game/component.h

index 6127cd4ce900e5ed023c4ed6e41214d7d9e9c9dd..9b78f963c156ae29a6aa925b57a52fb5c5dd73ee 100644 (file)
@@ -25,8 +25,9 @@ public:
        Handle<Entity> get_entity() const { return entity; }
 };
 
-template<typename T>
-class BufferedComponent: public Component
+template<typename T, typename Base = Component>
+       requires std::is_base_of_v<Component, Base>
+class BufferedComponent: public Base
 {
 public:
        using Data = T;
@@ -38,7 +39,7 @@ private:
        bool written = false;
 
 protected:
-       BufferedComponent(Handle<Entity> e): Component(e) { }
+       using Base::Base;
 
        const T &read() const;
        T &write();
@@ -51,8 +52,9 @@ public:
        bool was_written() const { return written; }
 };
 
-template<typename T>
-const T &BufferedComponent<T>::read() const
+template<typename T, typename Base>
+       requires std::is_base_of_v<Component, Base>
+const T &BufferedComponent<T, Base>::read() const
 {
 #ifdef DEBUG
        AccessGuard::get_instance().check<AccessGuard::Read<T>>();
@@ -60,8 +62,9 @@ const T &BufferedComponent<T>::read() const
        return data[read_index&1];
 }
 
-template<typename T>
-T &BufferedComponent<T>::write()
+template<typename T, typename Base>
+       requires std::is_base_of_v<Component, Base>
+T &BufferedComponent<T, Base>::write()
 {
 #ifdef DEBUG
        AccessGuard::get_instance().check<AccessGuard::Write<T>>();