]> git.tdb.fi Git - libs/game.git/commitdiff
Use a different way of determining the default transactor of a component
authorMikko Rasa <tdb@tdb.fi>
Mon, 31 Mar 2025 11:59:33 +0000 (14:59 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 31 Mar 2025 12:01:14 +0000 (15:01 +0300)
Declaring the type alias in BufferedComponent results in a transactor
for BufferedComponent<T>, which does not match the actual type used in
system dependencies.

source/game/component.h
source/game/system.h
source/game/transactor.h

index 7250660d1089270634f8bc9b0a8a7eba86e2c8e2..372e8d96e50cac825e853058236a9d86b391113d 100644 (file)
@@ -5,7 +5,6 @@
 #include "accessguard.h"
 #include "handle.h"
 #include "mspgame_api.h"
-#include "transactor.h"
 
 namespace Msp::Game {
 
@@ -31,7 +30,6 @@ class BufferedComponent: public Component
 {
 public:
        using Data = T;
-       using Transactor = BasicTransactor<BufferedComponent<T>>;
        
 private:
        T data[2];
index 51b032b0ac0492eb350ed2a8fee61c65e7c69a48..84671c2b7238bb3824f6e27b2b679b11d82eba21 100644 (file)
@@ -105,9 +105,9 @@ inline void System::declare_dependency(DependencyFlags flags)
        dep.flags = flags;
        if constexpr(std::is_base_of_v<Component, T>)
        {
-               if constexpr(requires{ typename T::Transactor; })
+               if constexpr(Transactable<T>)
                {
-                       dep.transactor = &stage.get_or_create_transactor<typename T::Transactor>();
+                       dep.transactor = &stage.get_or_create_transactor<typename TransactorFor<T>::Type>();
                        if((flags&UPDATE)==READ_OLD)
                                dep.transact_mode = Transactor::READ;
                        else if((flags&UPDATE)==WRITE)
index d278a9a8992c6d92d090ee7b8f7c136af5306aa7..93767f34698fabb162de4693535abc451f40dda7 100644 (file)
@@ -7,6 +7,10 @@
 
 namespace Msp::Game {
 
+template<typename T>
+concept Transactable =
+       requires(T &x) { typename T::Data; x.prepare_tick(); x.commit_tick(); };
+
 class MSPGAME_API Transactor
 {
 public:
@@ -84,6 +88,14 @@ void BasicTransactor<T>::commit(Mode mode)
                stage.iterate_objects<T>([](T &c){ c.commit_tick(); });
 }
 
+
+template<typename T>
+struct TransactorFor { using Type = BasicTransactor<T>; };
+
+template<typename T>
+       requires requires { typename T::Transactor; }
+struct TransactorFor<T> { using Type = typename T::Transactor; };
+
 } // namespace Msp::Game
 
 #endif