22template<
class TData,
class TDataBlock>
25 return this->g_data.size();
28template<
class TData,
class TDataBlock>
33template<
class TData,
class TDataBlock>
37 lock.throwIfDifferent(this->g_mutex);
38 return this->g_data.begin();
40template<
class TData,
class TDataBlock>
44 lock.throwIfDifferent(this->g_mutex);
45 return this->g_data.end();
48template<
class TData,
class TDataBlock>
51 return this->_g_badElement;
53template<
class TData,
class TDataBlock>
54typename BaseManager<TData, TDataBlock>::DataBlockPointer
59 return this->_g_badElement;
62 std::scoped_lock
const lck(this->g_mutex);
63 auto it = this->g_data.find(name);
65 if (it != this->g_data.end())
69 return this->_g_badElement;
71template<
class TData,
class TDataBlock>
79 std::scoped_lock
const lck(this->g_mutex);
80 return this->g_data.find(name) != this->g_data.end();
82template<
class TData,
class TDataBlock>
83bool BaseManager<TData, TDataBlock>::unload(std::string_view name)
90 std::scoped_lock
const lck(this->g_mutex);
91 auto it = this->g_data.find(name);
93 if (it != this->g_data.end())
95 it->second->_valid =
false;
96 it->second->_ptr = this->_g_badElement->_ptr;
98 this->g_data.erase(it);
103template<
class TData,
class TDataBlock>
104void BaseManager<TData, TDataBlock>::unloadAll()
106 std::scoped_lock
const lck(this->g_mutex);
108 for (
auto& data: this->g_data)
110 data.second->_valid =
false;
111 data.second->_ptr = this->_g_badElement->_ptr;
112 data.second->unload();
114 this->g_data.clear();
116template<
class TData,
class TDataBlock>
119 if (name.empty() || !block || !block->_ptr)
124 if (this->contains(name))
129 std::scoped_lock
const lck(this->g_mutex);
130 this->g_data.emplace(name, std::move(block));
136template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
138 g_data(TDataAccessorManagerInfo()().getBadElement()),
139 g_name(FGE_MANAGER_BAD)
141template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
143 g_data(TDataAccessorManagerInfo()().getElement(name)),
146template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
148 g_data(TDataAccessorManagerInfo()().getElement(name)),
151template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
152BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(std::string name) :
153 g_data(TDataAccessorManagerInfo()().getElement(name)),
154 g_name(std::move(name))
156template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
158 g_data(std::move(data)),
159 g_name(FGE_MANAGER_BAD)
161template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
163 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
165 g_data(std::move(data)),
166 g_name(FGE_MANAGER_BAD)
169template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
172 this->g_data = TDataAccessorManagerInfo()().getBadElement();
173 this->g_name = FGE_MANAGER_BAD;
176template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
179 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
182template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
185 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
187 return this->g_data->_valid;
191 if (std::holds_alternative<SharedDataType>(this->g_data))
193 return std::get<SharedDataType>(this->g_data)->_valid;
195 return static_cast<bool>(std::get<SharedType>(this->g_data));
199template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
200typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedDataType
const&
203 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
209 if (std::holds_alternative<SharedDataType>(this->g_data))
211 return std::get<SharedDataType>(this->g_data);
213 return TDataAccessorManagerInfo()().getBadElement();
216template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
217typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedType
const&
219 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
221 if (std::holds_alternative<SharedDataType>(this->g_data))
223 return std::get<SharedDataType>(this->g_data)->_ptr;
226 if (std::get<SharedType>(this->g_data))
228 return std::get<SharedType>(this->g_data);
230 return TDataAccessorManagerInfo()().getBadElement()->_ptr;
232template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
238template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
241 if (this->g_name == name)
247 this->g_data = TDataAccessorManagerInfo()().getElement(name);
250template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
253 if (this->g_name == name)
259 this->g_data = TDataAccessorManagerInfo()().getElement(name);
262template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
265 if (this->g_name == name)
270 this->g_name = std::move(name);
271 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
274template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
275auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedDataType data)
277 this->g_name = FGE_MANAGER_BAD;
278 this->g_data = std::move(data);
281template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
282auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedType data)
283 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
285 this->g_name = FGE_MANAGER_BAD;
286 this->g_data = std::move(data);
290template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
293 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
295 return this->g_data->_ptr.get();
299 if (std::holds_alternative<SharedDataType>(this->g_data))
301 return std::get<SharedDataType>(this->g_data)->_ptr.get();
304 if (std::get<SharedType>(this->g_data))
306 return std::get<SharedType>(this->g_data).get();
308 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
311template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
312typename TDataAccessorManagerInfo::Manager::DataType
const*
315 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
317 return this->g_data->_ptr.get();
321 if (std::holds_alternative<SharedDataType>(this->g_data))
323 return std::get<SharedDataType>(this->g_data)->_ptr.get();
326 if (std::get<SharedType>(this->g_data))
328 return std::get<SharedType>(this->g_data).get();
330 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
334template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
335static net::Packet
const& operator>>(net::Packet
const& pck, BaseDataAccessor<TDataAccessorManagerInfo, TOption>& data)
339 data = std::move(name);
342template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
343static net::Packet& operator<<(net::Packet& pck, BaseDataAccessor<TDataAccessorManagerInfo, TOption>
const& data)
345 return pck << data.getName();
348template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
349static void to_json(nlohmann::json& j, BaseDataAccessor<TDataAccessorManagerInfo, TOption>
const& p)
353template<
class TDataAccessorManagerInfo, DataAccessorOptions TOption>
354static void from_json(nlohmann::json
const& j, BaseDataAccessor<TDataAccessorManagerInfo, TOption>& p)
Class that lock a mutex and unlock it only when the object is destroyed.
Definition C_accessLock.hpp:38
Definition C_baseManager.hpp:182
SharedType const & getSharedData() const
Get the shared resource data.
Definition C_baseManager.inl:218
bool valid() const
Check if the font is valid (not unloaded)
Definition C_baseManager.inl:183
TDataAccessorManagerInfo::Manager::DataType * retrieve()
Retrieve the raw shared pointer from the current resource.
Definition C_baseManager.inl:291
SharedDataType const & getSharedBlock() const
Get the resource block data.
Definition C_baseManager.inl:201
virtual void clear()
Clear the resource.
Definition C_baseManager.inl:170
std::string const & getName() const
Get the name of the resource.
Definition C_baseManager.inl:233
void reload()
Reload the cached resource from the same name.
Definition C_baseManager.inl:177
Base class for all managers.
Definition C_baseManager.hpp:63
Map::const_iterator begin(AccessLock< std::mutex > const &lock) const
Get the "begin" iterator of the manager.
Definition C_baseManager.inl:35
DataBlockPointer getElement(std::string_view name) const
Get the resource with the given name.
Definition C_baseManager.inl:55
AccessLock< std::mutex > acquireLock() const
Acquire a AccessLock, with the manager mutex.
Definition C_baseManager.inl:29
std::size_t size() const
Get the number of elements in the manager.
Definition C_baseManager.inl:23
bool push(std::string_view name, DataBlockPointer block)
Add a user handled resource.
Definition C_baseManager.inl:117
DataBlockPointer const & getBadElement() const
Get the "bad" element.
Definition C_baseManager.inl:49
Map::const_iterator end(AccessLock< std::mutex > const &lock) const
Get the "end" iterator of the manager.
Definition C_baseManager.inl:42