1 #ifndef EAGINE_ECS_STORAGE_STD_MAP_HPP
9 #define EAGINE_ECS_STORAGE_STD_MAP_HPP
11 #include "../../assert.hpp"
12 #include "../cmp_storage.hpp"
13 #include "../rel_storage.hpp"
20 template <
typename Entity,
typename Component>
21 class std_map_cmp_storage;
23 template <
typename Entity,
typename Component>
24 class std_map_cmp_storage_iterator
25 :
public component_storage_iterator_intf<Entity> {
27 using _map_t =
typename std::map<Entity, Component>;
28 using _iter_t =
typename _map_t::iterator;
29 _map_t* _map{
nullptr};
32 friend class std_map_cmp_storage<Entity, Component>;
35 std_map_cmp_storage_iterator(_map_t& m) noexcept
41 void reset()
override {
46 auto done() ->
bool override {
48 return _i == _map->end();
51 void next()
override {
52 EAGINE_ASSERT(!done());
56 auto find(Entity e) ->
bool override {
67 while(++_i != _map->end()) {
75 auto current() -> Entity
override {
80 template <
typename Entity,
typename Component>
81 class std_map_cmp_storage :
public component_storage<Entity, Component> {
83 std::map<Entity, Component> _components{};
84 std::set<Entity> _hidden{};
86 using _map_iter_t = std_map_cmp_storage_iterator<Entity, Component>;
88 auto _iter_cast(component_storage_iterator<Entity>& i) noexcept ->
auto& {
89 EAGINE_ASSERT(
dynamic_cast<_map_iter_t*
>(i.ptr()));
90 return *
static_cast<_map_iter_t*
>(i.ptr());
93 auto _iter_entity(component_storage_iterator<Entity>& i) noexcept {
94 return _iter_cast(i)._i->first;
97 auto _remove(
typename std::map<Entity, Component>::iterator p) {
98 EAGINE_ASSERT(p != _components.end());
99 _hidden.erase(p->first);
100 return _components.erase(p);
104 using entity_param = entity_param_t<Entity>;
105 using iterator_t = component_storage_iterator<Entity>;
107 auto capabilities() -> storage_caps
override {
109 storage_cap_bit::hide | storage_cap_bit::remove |
110 storage_cap_bit::store | storage_cap_bit::modify};
113 auto new_iterator() -> iterator_t
override {
114 return iterator_t(
new _map_iter_t(_components));
117 void delete_iterator(iterator_t&& i)
override {
121 auto has(entity_param e) ->
bool override {
122 return _components.find(e) != _components.end();
125 auto is_hidden(entity_param e) ->
bool override {
126 return _hidden.find(e) != _hidden.end();
129 auto is_hidden(iterator_t& i) ->
bool override {
130 EAGINE_ASSERT(!i.done());
131 return is_hidden(_iter_entity(i));
134 auto hide(entity_param e) ->
bool override {
142 void hide(iterator_t& i)
override {
143 EAGINE_ASSERT(!i.done());
144 _hidden.insert(_iter_entity(i));
147 auto show(entity_param e) ->
bool override {
148 return _hidden.erase(e) > 0;
151 auto show(iterator_t& i) ->
bool override {
152 return _hidden.erase(_iter_entity(i)) > 0;
155 auto copy(entity_param ef, entity_param et) ->
bool override {
159 auto pf = _components.find(ef);
160 if(pf == _components.end()) {
163 return store(et, Component(pf->second));
166 auto swap(entity_param ea, entity_param eb) ->
bool override {
167 auto pa = _components.find(ea);
168 auto pb = _components.find(eb);
169 bool ha = is_hidden(ea);
170 bool hb = is_hidden(eb);
172 if(pa != _components.end() && pb != _components.end()) {
174 swap(pa->second, pb->second);
181 }
else if(pa != _components.end()) {
182 store(eb, std::move(pa->second));
187 }
else if(pb != _components.end()) {
188 store(ea, std::move(pb->second));
197 auto remove(entity_param e) ->
bool override {
199 return _components.erase(e) > 0;
202 void remove(iterator_t& i)
override {
203 EAGINE_ASSERT(!i.done());
204 _hidden.erase(_iter_entity(i));
205 _iter_cast(i)._i = _components.erase(_iter_cast(i)._i);
208 auto store(entity_param e, Component&& c) ->
bool override {
210 _components.emplace(e, std::move(c));
214 auto store(iterator_t& i, entity_param e, Component&& c) ->
bool override {
216 auto& p = _iter_cast(i)._i;
217 p = _components.emplace_hint(p, e, std::move(c));
222 callable_ref<
void(entity_param, manipulator<const Component>&)> func,
223 entity_param e)
override {
224 auto p = _components.find(e);
225 if(p != _components.end()) {
227 concrete_manipulator<const Component> m(
231 if(m.remove_requested()) {
239 callable_ref<
void(entity_param, manipulator<const Component>&)> func,
240 iterator_t& i)
override {
241 EAGINE_ASSERT(!i.done());
242 auto& p = _iter_cast(i)._i;
243 EAGINE_ASSERT(p != _components.end());
244 if(!is_hidden(p->first)) {
245 concrete_manipulator<const Component> m(
249 if(m.remove_requested()) {
256 callable_ref<
void(entity_param, manipulator<Component>&)> func,
257 entity_param e)
override {
258 auto p = _components.find(e);
259 if(p != _components.end()) {
262 concrete_manipulator<Component> m(
266 if(m.remove_requested()) {
274 callable_ref<
void(entity_param, manipulator<Component>&)> func,
275 iterator_t& i)
override {
276 EAGINE_ASSERT(!i.done());
277 auto& p = _iter_cast(i)._i;
278 EAGINE_ASSERT(p != _components.end());
279 if(!is_hidden(p->first)) {
281 concrete_manipulator<Component> m(
285 if(m.remove_requested()) {
292 callable_ref<
void(entity_param, manipulator<const Component>&)> func)
294 concrete_manipulator<const Component> m(
true );
295 auto p = _components.begin();
296 while(p != _components.end()) {
297 if(!is_hidden(p->first)) {
300 if(m.remove_requested()) {
312 callable_ref<
void(entity_param, manipulator<Component>&)> func)
override {
313 concrete_manipulator<Component> m(
true );
314 auto p = _components.begin();
315 while(p != _components.end()) {
316 if(!is_hidden(p->first)) {
320 if(m.remove_requested()) {
332 template <
typename Entity,
typename Relation>
333 class std_map_rel_storage;
335 template <
typename Entity,
typename Relation>
336 class std_map_rel_storage_iterator
337 :
public relation_storage_iterator_intf<Entity> {
339 using _pair_t = std::pair<Entity, Entity>;
340 using _map_t =
typename std::map<_pair_t, Relation>;
341 using _iter_t =
typename _map_t::iterator;
342 _map_t* _map{
nullptr};
345 friend class std_map_rel_storage<Entity, Relation>;
348 std_map_rel_storage_iterator(_map_t& m) noexcept
354 void reset()
override {
359 auto done() ->
bool override {
361 return _i == _map->end();
364 void next()
override {
365 EAGINE_ASSERT(!done());
369 auto subject() -> Entity
override {
370 return _i->first.first;
373 auto object() -> Entity
override {
374 return _i->first.second;
378 template <
typename Entity,
typename Relation>
379 class std_map_rel_storage :
public relation_storage<Entity, Relation> {
381 using _pair_t = std::pair<Entity, Entity>;
382 std::map<_pair_t, Relation> _relations;
384 using _map_iter_t = std_map_rel_storage_iterator<Entity, Relation>;
386 auto _iter_cast(relation_storage_iterator<Entity>& i) noexcept ->
auto& {
387 EAGINE_ASSERT(
dynamic_cast<_map_iter_t*
>(i.ptr()) !=
nullptr);
388 return *
static_cast<_map_iter_t*
>(i.ptr());
391 auto _remove(
typename std::map<_pair_t, Relation>::iterator p) {
392 EAGINE_ASSERT(p != _relations.end());
393 return _relations.erase(p);
397 using entity_param = entity_param_t<Entity>;
398 using iterator_t = relation_storage_iterator<Entity>;
400 auto capabilities() -> storage_caps
override {
402 storage_cap_bit::remove | storage_cap_bit::store |
403 storage_cap_bit::modify};
406 auto new_iterator() -> iterator_t
override {
407 return iterator_t(
new _map_iter_t(_relations));
410 void delete_iterator(iterator_t&& i)
override {
414 auto has(entity_param s, entity_param o) ->
bool override {
415 return _relations.find(_pair_t(s, o)) != _relations.end();
418 auto store(entity_param s, entity_param o) ->
bool override {
419 _relations.emplace(_pair_t(s, o), Relation());
423 auto store(entity_param s, entity_param o, Relation&& r) ->
bool override {
424 _relations.emplace(_pair_t(s, o), std::move(r));
428 auto remove(entity_param s, entity_param o) ->
bool override {
429 return _relations.erase(_pair_t(s, o)) > 0;
432 void remove(iterator_t& i)
override {
433 EAGINE_ASSERT(!i.done());
434 _iter_cast(i)._i = _relations.erase(_iter_cast(i)._i);
439 void(entity_param, entity_param, manipulator<const Relation>&)> func,
440 entity_param subject,
441 entity_param
object)
override {
442 auto po = _relations.find(_pair_t(subject,
object));
443 if(po != _relations.end()) {
444 concrete_manipulator<const Relation> m(
447 func(po->first.first, po->first.second, m);
448 if(m.remove_requested()) {
456 void(entity_param, entity_param, manipulator<const Relation>&)> func,
457 iterator_t& i)
override {
458 EAGINE_ASSERT(!i.done());
459 auto& po = _iter_cast(i)._i;
460 EAGINE_ASSERT(po != _relations.end());
462 concrete_manipulator<const Relation> m(
465 func(po->first.first, po->first.second, m);
466 if(m.remove_requested()) {
472 callable_ref<
void(entity_param, entity_param, manipulator<Relation>&)>
474 entity_param subject,
475 entity_param
object)
override {
476 auto po = _relations.find(_pair_t(subject,
object));
477 if(po != _relations.end()) {
479 concrete_manipulator<Relation> m(
482 func(po->first.first, po->first.second, m);
483 if(m.remove_requested()) {
490 callable_ref<
void(entity_param, entity_param, manipulator<Relation>&)>
492 iterator_t& i)
override {
493 EAGINE_ASSERT(!i.done());
494 auto& po = _iter_cast(i)._i;
495 EAGINE_ASSERT(po != _relations.end());
498 concrete_manipulator<Relation> m(
501 func(po->first.first, po->first.second, m);
502 if(m.remove_requested()) {
509 entity_param subject)
override {
511 auto po = _relations.lower_bound(_pair_t(subject,
object));
512 while((po != _relations.end()) && (po->first.first == subject)) {
513 func(subject, po->first.second);
518 void for_each(
callable_ref<
void(entity_param, entity_param)> func)
override {
519 for(
auto& p : _relations) {
520 func(p.first.first, p.first.second);
526 void(entity_param, entity_param, manipulator<const Relation>&)> func,
527 entity_param subject)
override {
528 concrete_manipulator<const Relation> m(
true );
530 auto po = _relations.lower_bound(_pair_t(subject,
object));
531 while((po != _relations.end()) && (po->first.first == subject)) {
533 func(subject, po->first.second, m);
534 if(m.remove_requested()) {
543 callable_ref<
void(entity_param, entity_param, manipulator<Relation>&)>
545 entity_param subject)
override {
546 concrete_manipulator<Relation> m(
true );
548 auto po = _relations.lower_bound(_pair_t(subject,
object));
549 while((po != _relations.end()) && (po->first.first == subject)) {
552 func(subject, po->first.second, m);
553 if(m.remove_requested()) {
562 callable_ref<
void(entity_param, entity_param, manipulator<const Relation>&)>
564 concrete_manipulator<const Relation> m(
true );
565 auto po = _relations.begin();
566 while(po != _relations.end()) {
568 func(po->first.first, po->first.second, m);
569 if(m.remove_requested()) {
578 callable_ref<
void(entity_param, entity_param, manipulator<Relation>&)>
580 concrete_manipulator<Relation> m(
true );
581 auto po = _relations.begin();
582 while(po != _relations.end()) {
585 func(po->first.first, po->first.second, m);
586 if(m.remove_requested()) {
598 #endif // EAGINE_ECS_STORAGE_STD_MAP_HPP