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::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>
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...

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< 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...)` returning a reference to the underlying concrete instance

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

## Instantiations

| Alias | AnyT | IdProvider | |-------|------|------------| | `SystemRegistry` | `System` | `SystemTypeId` | | `ManagerRegistry` | `Manager` | `ResourceTypeId` |

Template Parameters
AnyT

The type-erased wrapper type (must support `underlying()`).

IdProvider

Compile-time ID generator (must provide `id<T>().value()`).

See Also

SystemRegistry

See Also

ManagerRegistry

Todo

this impl needs to make sure that memory allocations / moves do not invalidate the fastAccess in ResourceRegistry

Definition at line 53 of file ConceptModelRegistry.ixx.

Public Member Functions

add()

template <typename T, typename... Args>
T & helios::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 141 of file ConceptModelRegistry.ixx.

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

has()

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

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 176 of file ConceptModelRegistry.ixx.

176 [[nodiscard]] bool has() const {
177 return item<T>() != nullptr;
178 }

item()

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

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 188 of file ConceptModelRegistry.ixx.

188 [[nodiscard]] T* item() const {
189
190 const auto idx = IdProvider::template id<T>().value();
191 if (items_.size() <= idx || underlyingAnyT_.size() <= idx) {
192 return nullptr;
193 }
194
195 return underlyingAnyT_[idx] ? static_cast<T*>(underlyingAnyT_[idx]) : nullptr;
196 }

Referenced by helios::core::container::ConceptModelRegistry< CommandBuffer, CommandBufferTypeId >::has.

items()

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

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

Returns

Span of const AnyT pointers.

Definition at line 108 of file ConceptModelRegistry.ixx.

108 [[nodiscard]] std::span<AnyT* const> items() const noexcept {
109 update();
110 return itemView_;
111 }

items()

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

Returns a mutable span of registered items in insertion order.

Returns

Span of AnyT pointers.

Definition at line 118 of file ConceptModelRegistry.ixx.

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

Private Member Functions

update()

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

Rebuilds the insertion-ordered view if dirty.

Definition at line 83 of file ConceptModelRegistry.ixx.

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

Private Member Attributes

insertionOrder_

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

Records insertion order for deterministic iteration.

Definition at line 68 of file ConceptModelRegistry.ixx.

68 std::vector<size_t> insertionOrder_;

items_

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

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

Definition at line 58 of file ConceptModelRegistry.ixx.

58 mutable std::vector<AnyT> items_;

itemView_

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

Lazily-built view of AnyT pointers in insertion order.

Definition at line 73 of file ConceptModelRegistry.ixx.

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

needsUpdate_

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

Dirty flag indicating itemView_ needs rebuilding.

Definition at line 78 of file ConceptModelRegistry.ixx.

78 mutable bool needsUpdate_ = false;

underlyingAnyT_

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

Cached raw pointers to the underlying concrete instances.

Definition at line 63 of file ConceptModelRegistry.ixx.

63 std::vector<void*> underlyingAnyT_;

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


Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.15.0.