HandleMultiMap.ixx File
Dense 1:N association map between two handle types. More...
Included Headers
#include <vector>
#include <span>
#include <cassert>
#include <concepts>
#include <iterator>
#include <cstddef>
#include <helios.ecs.types.EntityHandle>
Namespaces Index
| namespace | helios |
| namespace | engine |
| namespace | core |
| namespace | container |
Classes Index
| class | HandleMultiMap<TOneHandle, TManyHandle> |
|
Stores a one-to-many relation between handle domains. More... | |
| struct | Binding |
|
Represents one valid binding of the one-to-many relation. More... | |
| class | ConstIterator |
|
Forward iterator over dense bindings. More... | |
Description
Dense 1:N association map between two handle types.
File Listing
The file content with the documentation metadata removed is:
19export namespace helios::engine::core::container {
35 class HandleMultiMap {
69 class ConstIterator {
70 const HandleMultiMap* map_;
74 using iterator_category = std::forward_iterator_tag;
75 using value_type = Binding;
76 using difference_type = std::ptrdiff_t;
78 using reference = value_type; // By-Value Return
86 ConstIterator(const HandleMultiMap* map, std::size_t start_idx) noexcept
87 : map_(map), current_idx_(start_idx) {}
91 assert(current_idx_ < map_->denseValues_.size());
94 const auto valueIdx = value.entityId;
96 assert(valueIdx < map_->keys_.size());
99 return Binding{
100 map_->keys_[valueIdx],
112 ConstIterator operator++(int) noexcept {
113 ConstIterator tmp = *this;
115 return tmp;
119 [[nodiscard]] bool operator==(const ConstIterator& other) const noexcept {
120 return current_idx_ == other.current_idx_
121 && map_ == other.map_;
125 [[nodiscard]] bool operator!=(const ConstIterator& other) const noexcept {
126 return !(*this == other);
132 return ConstIterator(this, 0);
137 return ConstIterator(this, denseValues_.size());
150 requires std::same_as<TOneHandle, typename TOneEntity::Handle_type> && std::same_as<TManyHandle, typename TManyEntity::Handle_type>
151 bool bind(TOneEntity oneEntity, TManyEntity manyEntity) {
152 return bind(oneEntity.handle(), manyEntity.handle());
166 bool bind(const TOneHandle key, const TManyHandle value) {
169 const auto valueIdx = value.entityId;
172 if (valueIdx < keys_.size()
173 && keys_[valueIdx].isValid()) {
174 assert(false && "Value already exists");
179 if (values_.size() <= keyIdx) {
180 values_.resize(keyIdx + 1);
182 values_[keyIdx].push_back(value);
185 if (keys_.size() <= valueIdx) {
186 keys_.resize(valueIdx + 1);
203 [[nodiscard]] TOneHandle key(const TManyHandle value) const noexcept {
204 const auto valueIdx = value.entityId;
206 if (keys_.size() <= valueIdx) {
207 return TOneHandle{};
210 return keys_[valueIdx];
220 [[nodiscard]] std::span<const TManyHandle> values(const TOneHandle key) const noexcept {
224 if (values_.size() <= keyIdx) {
228 return values_[keyIdx];
244 void reserve(std::size_t keyCapacity, std::size_t valueCapacity) {
245 keys_.reserve(valueCapacity);
246 values_.reserve(keyCapacity);
247 denseValues_.reserve(valueCapacity);
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.