Skip to main content

ConceptModelRegistry Class Template

Generic type-indexed registry for type-erased wrapper instances. More...

Declaration

template <typename AnyT, typename IdProvider> class helios::engine::core::container::ConceptModelRegistry<AnyT, IdProvider> { ... }

Public Member Functions Index

template <typename AnyT, typename IdProvider>
auto items () const noexcept -> std::span< AnyT *const >

Returns a read-only span of registered items in insertion order. More...

template <typename AnyT, typename IdProvider>
auto items () noexcept -> std::span< AnyT * >

Returns a mutable span of registered items in insertion order. More...

template <typename T, typename... Args>
T &add (Args &&... args)

Registers and wraps a concrete instance of type T. More...

template <typename T>
T &add (AnyT &&wrapper)

Registers a pre-built wrapper instance for concrete type T. More...

template <typename T>
boolhas () const

Checks whether a concrete type T is registered. More...

template <typename T>
T *item () const

Returns a pointer to the registered instance of type T. More...

template <typename AnyT, typename IdProvider>
AnyT *item (IdProvider typeId) noexcept

Returns the item registered with the typeId-value, if any. More...

Private Member Functions Index

template <typename AnyT, typename IdProvider>
voidupdate () const

Rebuilds the insertion-ordered view if dirty. More...

Private Member Attributes Index

template <typename AnyT, typename IdProvider>
std::vector< std::unique_ptr< AnyT > >items_

Owning storage for wrapped AnyT instances, indexed by type ID. More...

template <typename AnyT, typename IdProvider>
std::vector< void * >underlyingAnyT_

Cached raw pointers to the underlying concrete instances. More...

template <typename AnyT, typename IdProvider>
std::vector< size_t >insertionOrder_

Records insertion order for deterministic iteration. More...

template <typename AnyT, typename IdProvider>
std::vector< AnyT * >itemView_

Lazily-built view of AnyT pointers in insertion order. More...

template <typename AnyT, typename IdProvider>
boolneedsUpdate_ = false

Dirty flag indicating itemView_ needs rebuilding. More...

Description

Generic type-indexed registry for type-erased wrapper instances.

ConceptModelRegistry stores instances of a type-erased wrapper AnyT (e.g. System, Manager) and indexes them by a compile-time IdProvider (e.g. SystemTypeId, ResourceTypeId). This provides:

  • O(1) lookup by concrete type via item<T>()
  • Insertion-order iteration via items() for deterministic processing
  • Type-safe registration via add<T>(args...) or add<T>(AnyT&&) returning a reference to the underlying concrete instance

The registry is used as the backend for SystemRegistry and ManagerRegistry.

Definition at line 52 of file ConceptModelRegistry.ixx.

Public Member Functions

add()

template <typename T, typename... Args>
T & helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::add (Args &&... args)
inline

Registers and wraps a concrete instance of type T.

Constructs T in-place from the forwarded arguments, wraps it in an AnyT, and stores it at the index determined by IdProvider::id<T>(). Returns a reference to the underlying concrete T instance.

Template Parameters
T

The concrete type to register.

Args

Constructor argument types for T.

Parameters
args

Arguments forwarded to the T constructor.

Returns

Reference to the registered T instance.

Precondition

T must not already be registered.

Definition at line 140 of file ConceptModelRegistry.ixx.

140 T& add(Args&&... args) {
141
142 assert(!has<T>() && "AnyT already registered.");
143
144 AnyT wrapper{T{std::forward<Args>(args)...}};
145
146 const auto idx = IdProvider::template id<T>().value();
147
148 if (items_.size() <= idx) {
149 items_.resize(idx + 1);
150 }
151 if (underlyingAnyT_.size() <= idx) {
152 underlyingAnyT_.resize(idx + 1);
153 }
154
155 items_[idx] = std::make_unique<AnyT>(std::move(wrapper));
156 void* rawUnderlying = items_[idx]->underlying();
157 underlyingAnyT_[idx] = rawUnderlying;
158
159
160 insertionOrder_.push_back(idx);
161
162 needsUpdate_ = true;
163 return *static_cast<T*>(rawUnderlying);
164 }

Reference helios::engine::core::registerComponents.

add()

template <typename T>
T & helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::add (AnyT && wrapper)
inline

Registers a pre-built wrapper instance for concrete type T.

Stores an already-constructed AnyT at the slot determined by IdProvider::id<T>() and returns the underlying T reference.

This overload is useful when wrapper construction needs custom arguments that are not expressed as T{args...} (for example, pre-wrapped systems with injected dependencies).

Template Parameters
T

The concrete type represented by wrapper.

Parameters
wrapper

Pre-built type-erased wrapper owning a T instance.

Returns

Reference to the registered T instance.

Precondition

wrapper must contain a concrete T instance.

Precondition

T should not already be registered.

Definition at line 186 of file ConceptModelRegistry.ixx.

187 const auto idx = IdProvider::template id<T>().value();
188
189 if (items_.size() <= idx) {
190 items_.resize(idx + 1);
191 }
192 if (underlyingAnyT_.size() <= idx) {
193 underlyingAnyT_.resize(idx + 1);
194 }
195
196 items_[idx] = std::make_unique<AnyT>(std::move(wrapper));
197
198 void* rawUnderlying = items_[idx]->underlying();
199 underlyingAnyT_[idx] = rawUnderlying;
200
201 insertionOrder_.push_back(idx);
202 needsUpdate_ = true;
203
204 return *static_cast<T*>(rawUnderlying);
205 }

Reference helios::engine::core::registerComponents.

has()

template <typename T>
bool helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::has ()
inline

Checks whether a concrete type T is registered.

Template Parameters
T

The type to check.

Returns

True if T has been added.

Definition at line 216 of file ConceptModelRegistry.ixx.

216 [[nodiscard]] bool has() const {
217 return item<T>() != nullptr;
218 }

Reference helios::engine::core::registerComponents.

Referenced by helios::engine::runtime::world::ResourceRegistry::has.

item()

template <typename T>
T * helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::item ()
inline

Returns a pointer to the registered instance of type T.

Template Parameters
T

The concrete type to look up.

Returns

Pointer to T, or nullptr if not registered.

Definition at line 228 of file ConceptModelRegistry.ixx.

228 [[nodiscard]] T* item() const {
229
230 const auto idx = IdProvider::template id<T>().value();
231 if (items_.size() <= idx || underlyingAnyT_.size() <= idx || !underlyingAnyT_[idx]) {
232 return nullptr;
233 }
234
235 return static_cast<T*>(underlyingAnyT_[idx]);
236 }

Reference helios::engine::core::registerComponents.

Referenced by helios::engine::runtime::world::ResourceRegistry::get and helios::engine::runtime::world::ResourceRegistry::tryGet.

item()

template <typename AnyT, typename IdProvider>
AnyT * helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::item (IdProvider typeId)
inline noexcept

Returns the item registered with the typeId-value, if any.

Parameters
typeId

The typeId of the component that should be returned.

Returns

A pointer to the item identified by typeId, or nullptr if not found.

Definition at line 245 of file ConceptModelRegistry.ixx.

245 [[nodiscard]] AnyT* item(IdProvider typeId) noexcept {
246 const auto idx = typeId.value();
247 return items_.size() > idx && underlyingAnyT_.size() > idx && underlyingAnyT_[idx] ? items_[idx].get() : nullptr;
248 }

Reference helios::engine::core::registerComponents.

items()

template <typename AnyT, typename IdProvider>
std::span< AnyT *const > helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::items ()
inline noexcept

items()

template <typename AnyT, typename IdProvider>
std::span< AnyT * > helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::items ()
inline noexcept

Returns a mutable span of registered items in insertion order.

Returns

Span of AnyT pointers.

Definition at line 117 of file ConceptModelRegistry.ixx.

117 [[nodiscard]] std::span<AnyT*> items() noexcept {
118 update();
119 return itemView_;
120 }

Private Member Functions

update()

template <typename AnyT, typename IdProvider>
void helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::update ()
inline

Rebuilds the insertion-ordered view if dirty.

Definition at line 82 of file ConceptModelRegistry.ixx.

82 void update() const {
83
84 if (!needsUpdate_) {
85 return;
86 }
87
88 itemView_.clear();
89 itemView_.reserve(insertionOrder_.size());
90
91 for (const auto insertionIndex : insertionOrder_) {
92 itemView_.push_back(items_[insertionIndex].get());
93 }
94
95 needsUpdate_ = false;
96
97 }

Private Member Attributes

insertionOrder_

template <typename AnyT, typename IdProvider>
std::vector<size_t> helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::insertionOrder_

Records insertion order for deterministic iteration.

Definition at line 67 of file ConceptModelRegistry.ixx.

67 std::vector<size_t> insertionOrder_;

items_

template <typename AnyT, typename IdProvider>
std::vector<std::unique_ptr<AnyT> > helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::items_
mutable

Owning storage for wrapped AnyT instances, indexed by type ID.

Definition at line 57 of file ConceptModelRegistry.ixx.

57 mutable std::vector<std::unique_ptr<AnyT>> items_;

itemView_

template <typename AnyT, typename IdProvider>
std::vector<AnyT*> helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::itemView_
mutable

Lazily-built view of AnyT pointers in insertion order.

Definition at line 72 of file ConceptModelRegistry.ixx.

72 mutable std::vector<AnyT*> itemView_;

needsUpdate_

template <typename AnyT, typename IdProvider>
bool helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::needsUpdate_ = false
mutable

Dirty flag indicating itemView_ needs rebuilding.

Definition at line 77 of file ConceptModelRegistry.ixx.

77 mutable bool needsUpdate_ = false;

underlyingAnyT_

template <typename AnyT, typename IdProvider>
std::vector<void*> helios::engine::core::container::ConceptModelRegistry< AnyT, IdProvider >::underlyingAnyT_

Cached raw pointers to the underlying concrete instances.

Definition at line 62 of file ConceptModelRegistry.ixx.

62 std::vector<void*> underlyingAnyT_;

The documentation for this class was generated from the following file:


Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.