22template<
class TData,
class TDataBlock>
23bool BaseManager<TData, TDataBlock>::isInitialized()
25 return this->_g_badElement !=
nullptr;
27template<
class TData,
class TDataBlock>
28void BaseManager<TData, TDataBlock>::uninitialize()
30 if (!this->isInitialized())
36 this->_g_badElement.reset();
39template<
class TData,
class TDataBlock>
42 return this->g_data.size();
45template<
class TData,
class TDataBlock>
50template<
class TData,
class TDataBlock>
54 lock.throwIfDifferent(this->g_mutex);
55 return this->g_data.begin();
57template<
class TData,
class TDataBlock>
61 lock.throwIfDifferent(this->g_mutex);
62 return this->g_data.end();
65template<
class TData,
class TDataBlock>
68 return this->_g_badElement;
70template<
class TData,
class TDataBlock>
71typename BaseManager<TData, TDataBlock>::DataBlockPointer
76 return this->_g_badElement;
79 std::scoped_lock
const lck(this->g_mutex);
80 auto it = this->g_data.find(name);
82 if (it != this->g_data.end())
86 return this->_g_badElement;
88template<
class TData,
class TDataBlock>
89bool BaseManager<TData, TDataBlock>::contains(std::string_view name)
const
96 std::scoped_lock
const lck(this->g_mutex);
97 return this->g_data.find(name) != this->g_data.end();
99template<
class TData,
class TDataBlock>
100bool BaseManager<TData, TDataBlock>::unload(std::string_view name)
107 std::scoped_lock
const lck(this->g_mutex);
108 auto it = this->g_data.find(name);
110 if (it != this->g_data.end())
112 it->second->_valid =
false;
113 it->second->_ptr = this->_g_badElement->_ptr;
114 it->second->unload();
115 this->g_data.erase(it);
120template<
class TData,
class TDataBlock>
121void BaseManager<TData, TDataBlock>::unloadAll()
123 std::scoped_lock
const lck(this->g_mutex);
125 for (
auto& data: this->g_data)
127 data.second->_valid =
false;
128 data.second->_ptr = this->_g_badElement->_ptr;
129 data.second->unload();
131 this->g_data.clear();
134template<
class TData,
class TDataBlock>
135bool BaseManager<TData, TDataBlock>::duplicate(std::string_view name, std::string_view newName)
137 std::scoped_lock
const lck(this->g_mutex);
139 if (newName.empty() || this->g_data.contains(newName))
144 auto it = this->g_data.find(name);
145 if (it == this->g_data.end())
150 if (!it->second->_valid)
155 auto newBlock = std::make_shared<TDataBlock>();
156 if (!it->second->duplicate(*newBlock) || !newBlock->_valid)
161 this->g_data.emplace(newName, std::move(newBlock));
165template<
class TData,
class TDataBlock>
168 if (name.empty() || !block || !block->_ptr)
173 if (this->contains(name))
178 std::scoped_lock
const lck(this->g_mutex);
179 this->g_data.emplace(name, std::move(block));
185template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
186BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor() :
187 g_data(TDataAccessorManagerInfo()().getBadElement()),
188 g_name(FGE_MANAGER_BAD)
190template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
191BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(std::string_view name) :
192 g_data(TDataAccessorManagerInfo()().getElement(name)),
195template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
196BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(
char const name[]) :
197 g_data(TDataAccessorManagerInfo()().getElement(name)),
200template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
201BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(std::string name) :
202 g_data(TDataAccessorManagerInfo()().getElement(name)),
203 g_name(std::move(name))
205template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
206BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(SharedDataType data) :
207 g_data(std::move(data)),
208 g_name(FGE_MANAGER_BAD)
210template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
211BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(SharedType data)
212 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
214 g_data(std::move(data)),
215 g_name(FGE_MANAGER_BAD)
218template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
221 this->g_data = TDataAccessorManagerInfo()().getBadElement();
222 this->g_name = FGE_MANAGER_BAD;
225template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
228 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
231template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
234 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
236 return this->g_data->_valid;
240 if (std::holds_alternative<SharedDataType>(this->g_data))
242 return std::get<SharedDataType>(this->g_data)->_valid;
244 return static_cast<bool>(std::get<SharedType>(this->g_data));
248template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
249typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedDataType
const&
252 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
258 if (std::holds_alternative<SharedDataType>(this->g_data))
260 return std::get<SharedDataType>(this->g_data);
262 return TDataAccessorManagerInfo()().getBadElement();
265template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
266typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedType
const&
268 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
270 if (std::holds_alternative<SharedDataType>(this->g_data))
272 return std::get<SharedDataType>(this->g_data)->_ptr;
275 if (std::get<SharedType>(this->g_data))
277 return std::get<SharedType>(this->g_data);
279 return TDataAccessorManagerInfo()().getBadElement()->_ptr;
281template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
287template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
288auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(std::string_view name)
290 if (this->g_name == name)
296 this->g_data = TDataAccessorManagerInfo()().getElement(name);
299template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
300auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(
char const name[])
302 if (this->g_name == name)
308 this->g_data = TDataAccessorManagerInfo()().getElement(name);
311template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
312auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(std::string name)
314 if (this->g_name == name)
319 this->g_name = std::move(name);
320 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
323template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
324auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedDataType data)
326 this->g_name = FGE_MANAGER_BAD;
327 this->g_data = std::move(data);
330template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
331auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedType data)
332 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
334 this->g_name = FGE_MANAGER_BAD;
335 this->g_data = std::move(data);
339template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
342 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
344 return this->g_data->_ptr.get();
348 if (std::holds_alternative<SharedDataType>(this->g_data))
350 return std::get<SharedDataType>(this->g_data)->_ptr.get();
353 if (std::get<SharedType>(this->g_data))
355 return std::get<SharedType>(this->g_data).get();
357 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
360template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
361typename TDataAccessorManagerInfo::Manager::DataType
const*
364 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
366 return this->g_data->_ptr.get();
370 if (std::holds_alternative<SharedDataType>(this->g_data))
372 return std::get<SharedDataType>(this->g_data)->_ptr.get();
375 if (std::get<SharedType>(this->g_data))
377 return std::get<SharedType>(this->g_data).get();
379 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
383template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
384typename TDataAccessorManagerInfo::Manager::DataType*
387 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
389 return this->g_data->_valid ? this->g_data->_ptr.get() :
nullptr;
393 if (std::holds_alternative<SharedDataType>(this->g_data))
395 return std::get<SharedDataType>(this->g_data)->_valid ? std::get<SharedDataType>(this->g_data)->_ptr.get()
399 if (std::get<SharedType>(this->g_data))
401 return std::get<SharedType>(this->g_data).get();
406template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
407typename TDataAccessorManagerInfo::Manager::DataType
const*
410 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
412 return this->g_data->_valid ? this->g_data->_ptr.get() :
nullptr;
416 if (std::holds_alternative<SharedDataType>(this->g_data))
418 return std::get<SharedDataType>(this->g_data)->_valid ? std::get<SharedDataType>(this->g_data)->_ptr.get()
422 if (std::get<SharedType>(this->g_data))
424 return std::get<SharedType>(this->g_data).get();
430template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
435 data = std::move(name);
438template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
441 return pck << data.getName();
444template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
449template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
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