FastEngine 0.9.4
A multiplayer oriented 2D engine made with Vulkan.
Loading...
Searching...
No Matches
C_baseManager.inl
1/*
2 * Copyright 2025 Guillaume Guillet
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17namespace fge::manager
18{
19
20//BaseManager
21
22template<class TData, class TDataBlock>
23bool BaseManager<TData, TDataBlock>::isInitialized()
24{
25 return this->_g_badElement != nullptr;
26}
27template<class TData, class TDataBlock>
28void BaseManager<TData, TDataBlock>::uninitialize()
29{
30 if (!this->isInitialized())
31 {
32 return;
33 }
34
35 this->unloadAll();
36 this->_g_badElement.reset();
37}
38
39template<class TData, class TDataBlock>
41{
42 return this->g_data.size();
43}
44
45template<class TData, class TDataBlock>
50template<class TData, class TDataBlock>
53{
54 lock.throwIfDifferent(this->g_mutex);
55 return this->g_data.begin();
56}
57template<class TData, class TDataBlock>
60{
61 lock.throwIfDifferent(this->g_mutex);
62 return this->g_data.end();
63}
64
65template<class TData, class TDataBlock>
66typename BaseManager<TData, TDataBlock>::DataBlockPointer const& BaseManager<TData, TDataBlock>::getBadElement() const
67{
68 return this->_g_badElement;
69}
70template<class TData, class TDataBlock>
71typename BaseManager<TData, TDataBlock>::DataBlockPointer
73{
74 if (name.empty())
75 {
76 return this->_g_badElement;
77 }
78
79 std::scoped_lock const lck(this->g_mutex);
80 auto it = this->g_data.find(name);
81
82 if (it != this->g_data.end())
83 {
84 return it->second;
85 }
86 return this->_g_badElement;
87}
88template<class TData, class TDataBlock>
89bool BaseManager<TData, TDataBlock>::contains(std::string_view name) const
90{
91 if (name.empty())
92 {
93 return false;
94 }
95
96 std::scoped_lock const lck(this->g_mutex);
97 return this->g_data.find(name) != this->g_data.end();
98}
99template<class TData, class TDataBlock>
100bool BaseManager<TData, TDataBlock>::unload(std::string_view name)
101{
102 if (name.empty())
103 {
104 return false;
105 }
106
107 std::scoped_lock const lck(this->g_mutex);
108 auto it = this->g_data.find(name);
109
110 if (it != this->g_data.end())
111 {
112 it->second->_valid = false;
113 it->second->_ptr = this->_g_badElement->_ptr;
114 it->second->unload();
115 this->g_data.erase(it);
116 return true;
117 }
118 return false;
119}
120template<class TData, class TDataBlock>
121void BaseManager<TData, TDataBlock>::unloadAll()
122{
123 std::scoped_lock const lck(this->g_mutex);
124
125 for (auto& data: this->g_data)
126 {
127 data.second->_valid = false;
128 data.second->_ptr = this->_g_badElement->_ptr;
129 data.second->unload();
130 }
131 this->g_data.clear();
132}
133
134template<class TData, class TDataBlock>
135bool BaseManager<TData, TDataBlock>::duplicate(std::string_view name, std::string_view newName)
136{
137 std::scoped_lock const lck(this->g_mutex);
138
139 if (newName.empty() || this->g_data.contains(newName))
140 {
141 return false;
142 }
143
144 auto it = this->g_data.find(name);
145 if (it == this->g_data.end())
146 {
147 return false;
148 }
149
150 if (!it->second->_valid)
151 { //Can't duplicate an invalid resource
152 return false;
153 }
154
155 auto newBlock = std::make_shared<TDataBlock>();
156 if (!it->second->duplicate(*newBlock) || !newBlock->_valid)
157 {
158 return false;
159 }
161 this->g_data.emplace(newName, std::move(newBlock));
162 return true;
163}
164
165template<class TData, class TDataBlock>
166bool BaseManager<TData, TDataBlock>::push(std::string_view name, DataBlockPointer block)
167{
168 if (name.empty() || !block || !block->_ptr)
169 {
170 return false;
171 }
172
173 if (this->contains(name))
175 return false;
176 }
177
178 std::scoped_lock const lck(this->g_mutex);
179 this->g_data.emplace(name, std::move(block));
180 return true;
181}
182
183//BaseDataAccessor
184
185template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
186BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor() :
187 g_data(TDataAccessorManagerInfo()().getBadElement()),
188 g_name(FGE_MANAGER_BAD)
189{}
190template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
191BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(std::string_view name) :
192 g_data(TDataAccessorManagerInfo()().getElement(name)),
193 g_name(name)
194{}
195template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
196BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(char const name[]) :
197 g_data(TDataAccessorManagerInfo()().getElement(name)),
198 g_name(name)
199{}
200template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
201BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(std::string name) :
202 g_data(TDataAccessorManagerInfo()().getElement(name)),
203 g_name(std::move(name))
204{}
205template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
206BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(SharedDataType data) :
207 g_data(std::move(data)),
208 g_name(FGE_MANAGER_BAD)
209{}
210template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
211BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(SharedType data)
212 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
213 :
214 g_data(std::move(data)),
215 g_name(FGE_MANAGER_BAD)
216{}
217
218template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
220{
221 this->g_data = TDataAccessorManagerInfo()().getBadElement();
222 this->g_name = FGE_MANAGER_BAD;
223}
224
225template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
227{
228 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
229}
230
231template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
234 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
235 {
236 return this->g_data->_valid;
237 }
238 else
239 {
240 if (std::holds_alternative<SharedDataType>(this->g_data))
241 {
242 return std::get<SharedDataType>(this->g_data)->_valid;
243 }
244 return static_cast<bool>(std::get<SharedType>(this->g_data));
246}
247
248template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
249typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedDataType const&
251{
252 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
253 {
254 return this->g_data;
255 }
256 else
257 {
258 if (std::holds_alternative<SharedDataType>(this->g_data))
259 {
260 return std::get<SharedDataType>(this->g_data);
261 }
262 return TDataAccessorManagerInfo()().getBadElement();
263 }
264}
265template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
266typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedType const&
268 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
269{
270 if (std::holds_alternative<SharedDataType>(this->g_data))
271 {
272 return std::get<SharedDataType>(this->g_data)->_ptr;
273 }
274
275 if (std::get<SharedType>(this->g_data))
276 {
277 return std::get<SharedType>(this->g_data);
278 }
279 return TDataAccessorManagerInfo()().getBadElement()->_ptr;
280}
281template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
284 return this->g_name;
285}
286
287template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
288auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(std::string_view name)
289{
290 if (this->g_name == name)
292 return *this;
293 }
294
295 this->g_name = name;
296 this->g_data = TDataAccessorManagerInfo()().getElement(name);
297 return *this;
298}
299template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
300auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(char const name[])
301{
302 if (this->g_name == name)
303 {
304 return *this;
305 }
306
307 this->g_name = name;
308 this->g_data = TDataAccessorManagerInfo()().getElement(name);
309 return *this;
310}
311template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
312auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(std::string name)
313{
314 if (this->g_name == name)
315 {
316 return *this;
317 }
318
319 this->g_name = std::move(name);
320 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
321 return *this;
322}
323template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
324auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedDataType data)
325{
326 this->g_name = FGE_MANAGER_BAD;
327 this->g_data = std::move(data);
328 return *this;
329}
330template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
331auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedType data)
332 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
333{
334 this->g_name = FGE_MANAGER_BAD;
335 this->g_data = std::move(data);
336 return *this;
337}
338
339template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
340typename TDataAccessorManagerInfo::Manager::DataType* BaseDataAccessor<TDataAccessorManagerInfo, TOption>::retrieve()
341{
342 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
343 {
344 return this->g_data->_ptr.get();
345 }
346 else
347 {
348 if (std::holds_alternative<SharedDataType>(this->g_data))
349 {
350 return std::get<SharedDataType>(this->g_data)->_ptr.get();
351 }
352
353 if (std::get<SharedType>(this->g_data))
354 {
355 return std::get<SharedType>(this->g_data).get();
356 }
357 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
358 }
359}
360template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
361typename TDataAccessorManagerInfo::Manager::DataType const*
363{
364 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
365 {
366 return this->g_data->_ptr.get();
367 }
368 else
369 {
370 if (std::holds_alternative<SharedDataType>(this->g_data))
371 {
372 return std::get<SharedDataType>(this->g_data)->_ptr.get();
373 }
374
375 if (std::get<SharedType>(this->g_data))
376 {
377 return std::get<SharedType>(this->g_data).get();
378 }
379 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
380 }
381}
382
383template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
384typename TDataAccessorManagerInfo::Manager::DataType*
386{
387 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
388 {
389 return this->g_data->_valid ? this->g_data->_ptr.get() : nullptr;
390 }
391 else
392 {
393 if (std::holds_alternative<SharedDataType>(this->g_data))
394 {
395 return std::get<SharedDataType>(this->g_data)->_valid ? std::get<SharedDataType>(this->g_data)->_ptr.get()
396 : nullptr;
397 }
398
399 if (std::get<SharedType>(this->g_data))
400 {
401 return std::get<SharedType>(this->g_data).get();
402 }
403 return nullptr;
404 }
405}
406template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
407typename TDataAccessorManagerInfo::Manager::DataType const*
409{
410 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
411 {
412 return this->g_data->_valid ? this->g_data->_ptr.get() : nullptr;
413 }
414 else
415 {
416 if (std::holds_alternative<SharedDataType>(this->g_data))
417 {
418 return std::get<SharedDataType>(this->g_data)->_valid ? std::get<SharedDataType>(this->g_data)->_ptr.get()
419 : nullptr;
420 }
421
422 if (std::get<SharedType>(this->g_data))
423 {
424 return std::get<SharedType>(this->g_data).get();
425 }
426 return nullptr;
427 }
428}
429
430template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
431static net::Packet const& operator>>(net::Packet const& pck, BaseDataAccessor<TDataAccessorManagerInfo, TOption>& data)
432{
433 std::string name;
434 pck >> name;
435 data = std::move(name);
436 return pck;
437}
438template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
439static net::Packet& operator<<(net::Packet& pck, BaseDataAccessor<TDataAccessorManagerInfo, TOption> const& data)
440{
441 return pck << data.getName();
442}
443
444template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
445static void to_json(nlohmann::json& j, BaseDataAccessor<TDataAccessorManagerInfo, TOption> const& p)
446{
447 j = p.getName();
448}
449template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
450static void from_json(nlohmann::json const& j, BaseDataAccessor<TDataAccessorManagerInfo, TOption>& p)
451{
452 std::string name;
453 j.get_to(name);
454 p = std::move(name);
455}
456
457} // namespace fge::manager
Class that lock a mutex and unlock it only when the object is destroyed.
Definition C_accessLock.hpp:38
Definition C_baseManager.hpp:199
SharedType const & getSharedData() const
Get the shared resource data.
Definition C_baseManager.inl:267
bool valid() const
Check if the font is valid (not unloaded)
Definition C_baseManager.inl:232
TDataAccessorManagerInfo::Manager::DataType * retrieve()
Retrieve the raw shared pointer from the current resource.
Definition C_baseManager.inl:340
SharedDataType const & getSharedBlock() const
Get the resource block data.
Definition C_baseManager.inl:250
virtual void clear()
Clear the resource.
Definition C_baseManager.inl:219
std::string const & getName() const
Get the name of the resource.
Definition C_baseManager.inl:282
TDataAccessorManagerInfo::Manager::DataType * retrieveValid()
Retrieve the raw shared pointer from the current resource only if the resource is valid.
Definition C_baseManager.inl:385
void reload()
Reload the cached resource from the same name.
Definition C_baseManager.inl:226
Base class for all managers.
Definition C_baseManager.hpp:78
Map::const_iterator begin(AccessLock< std::mutex > const &lock) const
Get the "begin" iterator of the manager.
Definition C_baseManager.inl:52
DataBlockPointer getElement(std::string_view name) const
Get the resource with the given name.
Definition C_baseManager.inl:72
AccessLock< std::mutex > acquireLock() const
Acquire a AccessLock, with the manager mutex.
Definition C_baseManager.inl:46
std::size_t size() const
Get the number of elements in the manager.
Definition C_baseManager.inl:40
bool push(std::string_view name, DataBlockPointer block)
Add a user handled resource.
Definition C_baseManager.inl:166
DataBlockPointer const & getBadElement() const
Get the "bad" element.
Definition C_baseManager.inl:66
Map::const_iterator end(AccessLock< std::mutex > const &lock) const
Get the "end" iterator of the manager.
Definition C_baseManager.inl:59