Foray Library
rapid prototyping framework for crossplatform development of vulkan hardware ray tracing applications
Loading...
Searching...
No Matches
foray_registry.hpp
Go to the documentation of this file.
1#pragma once
2#include "../foray_basics.hpp"
3#include "../foray_exception.hpp"
4#include "foray_component.hpp"
5// #include "foray_rootregistry.hpp"
6#include <vector>
7
8namespace foray::scene {
11 class Registry : public NoMoveDefaults
12 {
13 public:
14 inline Registry() {}
16
18 template <typename TComponent, typename... Args>
19 inline TComponent* MakeComponent(Args&&... args);
20
22 template <typename TComponent>
23 inline void AddComponent(TComponent* component);
24
26 template <typename TComponent>
28
30 template <typename TComponent>
31 inline bool HasComponent() const;
32
34 template <typename TComponent>
35 inline TComponent* GetComponent();
36
38 template <typename TComponent>
39 inline const TComponent* GetComponent() const;
40
42 template <typename TComponent>
43 inline int32_t GetComponents(std::vector<TComponent*>& out);
44
46 template <typename TComponent>
47 inline int32_t GetComponents(std::vector<const TComponent*>& out) const;
48
51
53 virtual void Destroy();
54
55 inline virtual ~Registry() { Destroy(); }
56
59
61
63 FORAY_GETTER_CR(Components)
64
65 protected:
67 std::vector<Component*> mComponents = {};
68
71
74 };
75
76 template <typename TComponent, typename... Args>
77 inline TComponent* Registry::MakeComponent(Args&&... args)
78 {
79 Assert(mCallbackDispatcher, "Registry::AddComponent: No Root Registry defined!");
80
81 TComponent* value = new TComponent(std::forward<Args>(args)...);
83 return value;
84 }
85
86 template <typename TComponent>
87 inline void Registry::AddComponent(TComponent* component)
88 {
89 Assert(mCallbackDispatcher, "Registry::AddComponent: No Root Registry defined!");
90 Assert(component, "Registry::AddComponent: Parameter component is nullptr!");
91 Assert(!component->GetRegistry(), "Registry::AddComponent: Component is already attached to other registry!");
92
94 }
95
96 template <typename TComponent>
97 inline void Registry::MoveComponent(TComponent* component)
98 {
99 Assert(mCallbackDispatcher, "Registry::AddComponent: No Root Registry defined!");
100 Assert(component, "Registry::AddComponent: Parameter component is nullptr!");
101 if(component->GetRegistry())
102 {
103 Registry* registry = component->GetRegistry();
105 }
107 }
108
109 template <typename TComponent>
110 inline bool Registry::HasComponent() const
111 {
112 const auto value = GetComponent<TComponent>();
113 return value != nullptr;
114 }
115
116 template <typename TComponent>
117 inline TComponent* Registry::GetComponent()
118 {
120 {
121 auto cast = dynamic_cast<TComponent*>(component);
122 if(cast)
123 {
124 return cast;
125 }
126 }
127 return nullptr;
128 }
129
130 template <typename TComponent>
131 inline const TComponent* Registry::GetComponent() const
132 {
133 for(const Component* component : mComponents)
134 {
135 auto cast = dynamic_cast<const TComponent*>(component);
136 if(cast)
137 {
138 return cast;
139 }
140 }
141 return nullptr;
142 }
143
144 template <typename TComponent>
145 inline int32_t Registry::GetComponents(std::vector<TComponent*>& out)
146 {
147 int32_t writes = 0;
149 {
150 auto cast = dynamic_cast<TComponent*>(component);
151 if(cast)
152 {
153 out.push_back(cast);
154 writes++;
155 }
156 }
157 return writes;
158 }
159
160 template <typename TComponent>
161 inline int32_t Registry::GetComponents(std::vector<const TComponent*>& out) const
162 {
163 int32_t writes = 0;
164 for(const Component* component : mComponents)
165 {
166 auto cast = dynamic_cast<const TComponent*>(component);
167 if(cast)
168 {
169 out.push_back(cast);
170 writes++;
171 }
172 }
173 return writes;
174 }
175
177 {
178 Assert(component, "Registry::RemoveDeleteComponent: Parameter component is nullptr!");
179 Assert(mCallbackDispatcher, "Registry::RemoveDeleteComponent: No Root Registry defined!");
180 Assert(Unregister(component), "Registry::RemoveDeleteComponent: Component not registered!");
181
182 delete component;
183
184 return false;
185 }
186
188 {
189 Assert(mComponents.size() == 0, "Registry::SetCallbackDispatcher: Cannot transfer root registry with components. Finalize first!");
191 return *this;
192 }
193} // namespace foray
Simple types for supressing automatic definition of duplicating move constructors & operator.
Definition foray_basics.hpp:19
Type maintaining callback lists for event distribution.
Definition foray_callbackdispatcher.hpp:12
Base class for all types manageable by registry.
Definition foray_component.hpp:13
Manages a type identified list of components.
Definition foray_registry.hpp:12
Registry()
Definition foray_registry.hpp:14
virtual ~Registry()
Definition foray_registry.hpp:55
Registry & SetCallbackDispatcher(CallbackDispatcher *rootRegistry)
The root registry manages global callbacks invokable on the components.
Definition foray_registry.hpp:187
bool HasComponent() const
Test wether a component matching type TComponent is registered.
Definition foray_registry.hpp:110
void RegisterToRoot(Component *component)
CallbackDispatcher * mCallbackDispatcher
All components attached to the registry.
Definition foray_registry.hpp:66
std::vector< Component * > mComponents
Definition foray_registry.hpp:67
void AddComponent(TComponent *component)
Adds a manually instantiated component instance (initiate with new, Registry manages finalization)
Definition foray_registry.hpp:87
void Register(Component *component)
TComponent * MakeComponent(Args &&... args)
Instantiates a new componente.
Definition foray_registry.hpp:77
TComponent * GetComponent()
Gets first component that can be cast to TComponent type.
Definition foray_registry.hpp:117
bool Unregister(Component *component)
void MoveComponent(TComponent *component)
Moves a component registered to a different Registry to this.
Definition foray_registry.hpp:97
void UnregisterFromRoot(Component *component)
Registry(CallbackDispatcher *root)
Definition foray_registry.hpp:15
bool RemoveDeleteComponent(Component *component)
Removes and finalizes a component.
Definition foray_registry.hpp:176
virtual void Destroy()
Finalizes all attached components.
int32_t GetComponents(std::vector< TComponent * > &out)
Appends all components which can be cast to TComponent type to the out vector.
Definition foray_registry.hpp:145
#define FORAY_GETTER_V(member)
Return value.
Definition foray_basics.hpp:39
#define FORAY_GETTER_CR(member)
Return constant reference.
Definition foray_basics.hpp:60
Definition foray_animation.hpp:8
void Assert(bool condition, const source_location location=source_location::current())
Asserts condition. Throws a generic error message if conditition is false.
Definition foray_exception.hpp:52