]> git.tdb.fi Git - libs/game.git/commitdiff
Adjust some things to make header dependencies easier to manage
authorMikko Rasa <tdb@tdb.fi>
Wed, 19 Oct 2022 08:01:30 +0000 (11:01 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 19 Oct 2022 08:05:23 +0000 (11:05 +0300)
source/game/entity.cpp
source/game/entity.h
source/game/owned.h
source/game/stage.cpp
source/game/stage.h

index 95ad686b056266c99be89266a5005c7e6941c7d8..055c8d63d4dde384c6f3e4cead73b770a76b8c79 100644 (file)
@@ -1,6 +1,6 @@
 #include "entity.h"
 #include "component.h"
-#include "stage.h"
+#include "root.h"
 
 using namespace std;
 
@@ -36,4 +36,10 @@ void Entity::remove_child(Handle<Entity> child)
        erase(children, child);
 }
 
+Stage &Entity::get_stage()
+{
+       Handle<Entity> root = get_root();
+       return dynamic_cast<Root &>(*root).get_stage();
+}
+
 } // namespace Msp::Game
index 922f552f4aaac7f642f0cfeda14de22009614da4..7c7ee89fe85cf2c117fccd7f259540dafe3b93b6 100644 (file)
@@ -6,6 +6,7 @@
 namespace Msp::Game {
 
 class Component;
+class Stage;
 
 class hierarchy_error: public std::logic_error
 {
@@ -32,6 +33,7 @@ public:
 
        Handle<Entity> get_parent() const { return parent; }
        Handle<Entity> get_root();
+       Stage &get_stage();
 };
 
 
index df3cd94f2fde19079742f1a317be059b576e672d..19daa7efe12afbbffeb3676d635088daca4889ff 100644 (file)
@@ -3,13 +3,12 @@
 
 #include <stdexcept>
 #include "handle.h"
+#include "stage.h"
 
 namespace Msp::Game {
 
 class Component;
 class Entity;
-class Root;
-class Stage;
 
 template<typename T>
 class Owned: public Handle<T>
@@ -68,13 +67,10 @@ template<typename T>
 template<typename O>
 Stage &Owned<T>::get_stage(O &obj)
 {
-       using DependentRoot = std::conditional_t<sizeof(T), Root, Root>;
        if constexpr(std::is_base_of_v<Component, O>)
                return get_stage(*obj.get_entity());
-       else if constexpr(std::is_base_of_v<Entity, O>)
-               return dynamic_cast<DependentRoot &>(*obj.get_root()).get_stage();
        else
-               return obj;
+               return obj.get_stage();
 }
 
 template<typename T>
index a6bd19a9b5b6134e76e9e4fa70099ceaad6f2b67..a616d5a94da775ebd61da5171e9b4baf2435215d 100644 (file)
@@ -1,13 +1,14 @@
 #include "stage.h"
+#include "root.h"
 #include "system.h"
 
 namespace Msp::Game {
 
 Stage::Stage():
-       root(*this)
+       root(std::make_unique<Root>(*this))
 { }
 
-// Hide ~unique_ptr<System> from the header
+// Hide unique_ptr destructors from the header
 Stage::~Stage()
 { }
 
index 060759696914264ce5c177c0d1674a154b253e52..47ca47d9a572b6c5742e5a5279877d5af983584c 100644 (file)
@@ -4,17 +4,19 @@
 #include <memory>
 #include <msp/time/timedelta.h>
 #include "handle.h"
-#include "root.h"
 
 namespace Msp::Game {
 
+class Root;
 class System;
 
 class Stage
 {
 private:
        PoolPool pools;
-       Root root;
+       /* Use unique_ptr because there's only one root per stage so it's pointless
+       to put it in a pool. */
+       std::unique_ptr<Root> root;
        std::vector<std::unique_ptr<System>> systems;
 
 public:
@@ -22,7 +24,7 @@ public:
        ~Stage();
 
        PoolPool &get_pools() { return pools; }
-       Handle<Root> get_root() { return Handle<Root>::from_object(&root); }
+       Handle<Root> get_root() { return Handle<Root>::from_object(root.get()); }
 
        template<typename T, typename F>
        void iterate_objects(const F &);