entttree 0.1.0
Hierarchical entity management for EnTT
Loading...
Searching...
No Matches
defs.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <cstddef>
9#include <functional>
10#include <optional>
11#include <ranges>
12
13#include <ankerl/unordered_dense.h>
14
15#include <geomc/linalg/LinalgTypes.h>
16#include <geomc/shape/ShapeTypes.h>
17#include <geomc/Hash.h>
18#include <geomc/SmallStorage.h>
19
20#include <entt/entt.hpp>
21
22using namespace geom;
23
24namespace entttree {
25
27template <typename K, typename V, typename Hasher=std::hash<K>, typename KeyEqual=std::equal_to<K>>
28using DenseMap = ankerl::unordered_dense::map<K,V,Hasher,KeyEqual>;
29
31template <typename T, typename Hasher=std::hash<T>, typename KeyEqual=std::equal_to<T>>
32using DenseSet = ankerl::unordered_dense::set<T,Hasher,KeyEqual>;
33
35enum struct DfsOrder {
40};
41
43enum struct SiblingOrder {
45 Forward,
48};
49
50
55template <typename K, typename V>
56std::optional<V> get_or(const DenseMap<K,V>& m, const K& k) {
57 auto i = m.find(k);
58 if (i == m.end()) return std::nullopt;
59 return i->second;
60}
61
66template <typename K, typename V>
67V get_or(const DenseMap<K,V>& m, const K& k, const V& v) {
68 auto i = m.find(k);
69 return i == m.end() ? v : i->second;
70}
71
76template <typename K, typename V, typename Arg>
77std::optional<V> exchange(DenseMap<K,V>& m, const K& k, Arg&& v) {
78 auto [item, inserted] = m.try_emplace(k, v);
79 if (not inserted) {
80 V old_value = std::move(item->second);
81 item->second = V {std::forward<Arg>(v)};
82 return old_value;
83 }
84 return std::nullopt;
85}
86
91template <typename K, typename V>
92std::optional<V> remove_item(DenseMap<K,V>& m, const K& k) {
93 auto it = m.find(k);
94 if (it != m.end()) {
95 V old_value = std::move(it->second);
96 m.erase(it);
97 return old_value;
98 }
99 return std::nullopt;
100}
101
102} // namespace entttree
std::optional< V > get_or(const DenseMap< K, V > &m, const K &k)
Look up a key in a DenseMap, returning an optional value.
Definition defs.h:56
std::optional< V > remove_item(DenseMap< K, V > &m, const K &k)
Remove a key from a DenseMap.
Definition defs.h:92
ankerl::unordered_dense::set< T, Hasher, KeyEqual > DenseSet
High-performance hash set backed by ankerl::unordered_dense.
Definition defs.h:32
std::optional< V > exchange(DenseMap< K, V > &m, const K &k, Arg &&v)
Insert or replace a value in a DenseMap.
Definition defs.h:77
DfsOrder
Controls the visit order for depth-first traversal.
Definition defs.h:35
@ DeepFirst
Visit a node after its descendants (post-order).
@ ShallowFirst
Visit a node before its descendants (pre-order).
SiblingOrder
Controls the iteration order of siblings within a parent.
Definition defs.h:43
@ Forward
Iterate siblings in ascending position order.
@ Backward
Iterate siblings in descending position order.
ankerl::unordered_dense::map< K, V, Hasher, KeyEqual > DenseMap
High-performance hash map backed by ankerl::unordered_dense.
Definition defs.h:28
A system for maintaining parent-child relationships on entities.
Definition hierarchy.h:37