3 #include "../generic/containers/polylist.h"
9 #include "particle_system.h"
11 #include "ui/button.h"
14 #include "ui/progress_bar.h"
16 #include "ui/keyboard.h"
18 #define STAGE_NODE_MANAGER_DEBUG 0
23 template<
typename PoolType,
typename IDType,
typename T,
typename ...Subtypes>
35 const PoolType* pool()
const {
39 template<
typename Derived,
typename... Args>
40 Derived* make_as(Args&&... args) {
41 auto pair = pool_->template create<Derived>(
42 std::forward<Args>(args)...
45 Derived* derived = pair.first;
48 derived->_overwrite_id(IDType(pair.second));
49 derived->_bind_id_pointer(derived);
51 if(!derived->init()) {
53 pool_->erase(pool_->find(pair.second));
57 objects_.push_back(derived);
62 template<
typename... Args>
63 T* make(Args&&... args) {
64 return make_as<T>(std::forward<Args>(args)...);
67 bool contains(
const IDType&
id)
const {
71 T* get(
const IDType&
id)
const {
73 T* result =
dynamic_cast<T*
>(node);
74 #if STAGE_NODE_MANAGER_DEBUG
75 assert((node && result) || (!node && !result));
80 T* clone(
const IDType&
id,
this_type* target_manager=
nullptr) {
82 return target_manager->make(*source);
85 bool destroy(
const IDType&
id) {
86 auto it = pool_->find(
id.value());
87 if(it != pool_->end()) {
89 if(!(*it)->destroyed_) {
90 (*it)->signal_destroyed()();
91 (*it)->destroyed_ =
true;
94 queued_for_destruction_.insert(
id);
107 destroy_all_next_clean_ =
true;
110 bool destroy_immediately(
const IDType&
id) {
111 auto it = pool_->find(
id.value());
112 if(it != pool_->end()) {
116 if(!(*it)->destroyed_) {
117 (*it)->signal_destroyed()();
118 (*it)->destroyed_ =
true;
121 T* a =
dynamic_cast<T*
>(node);
122 assert((node && a) || (!node && !a));
128 queued_for_destruction_.erase(
id);
135 if(destroy_all_next_clean_) {
136 destroy_all_next_clean_ =
false;
137 for(
auto ptr: objects_) {
139 pool_->erase(pool_->find(ptr->id().value()));
143 auto queued = queued_for_destruction_;
144 for(
auto i: queued) {
145 destroy_immediately(i);
148 queued_for_destruction_.clear();
151 std::size_t size()
const {
152 return objects_.size();
155 typename std::list<T*>::iterator begin() {
156 return objects_.begin();
159 typename std::list<T*>::iterator end() {
160 return objects_.end();
164 PoolType* pool_ =
nullptr;
165 std::list<T*> objects_;
166 std::set<IDType> queued_for_destruction_;
167 bool destroy_all_next_clean_ =
false;