FastEngine 0.9.3
A multiplayer oriented 2D engine made with Vulkan.
Loading...
Searching...
No Matches
C_baseManager.inl
1/*
2 * Copyright 2024 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>
24{
25 return this->g_data.size();
26}
27
28template<class TData, class TDataBlock>
33template<class TData, class TDataBlock>
36{
37 lock.throwIfDifferent(this->g_mutex);
38 return this->g_data.begin();
39}
40template<class TData, class TDataBlock>
43{
44 lock.throwIfDifferent(this->g_mutex);
45 return this->g_data.end();
46}
47
48template<class TData, class TDataBlock>
49typename BaseManager<TData, TDataBlock>::DataBlockPointer const& BaseManager<TData, TDataBlock>::getBadElement() const
50{
51 return this->_g_badElement;
52}
53template<class TData, class TDataBlock>
54typename BaseManager<TData, TDataBlock>::DataBlockPointer
56{
57 if (name.empty())
58 {
59 return this->_g_badElement;
60 }
61
62 std::scoped_lock const lck(this->g_mutex);
63 auto it = this->g_data.find(name);
64
65 if (it != this->g_data.end())
66 {
67 return it->second;
68 }
69 return this->_g_badElement;
70}
71template<class TData, class TDataBlock>
72bool BaseManager<TData, TDataBlock>::contains(std::string_view name) const
73{
74 if (name.empty())
75 {
76 return false;
77 }
78
79 std::scoped_lock const lck(this->g_mutex);
80 return this->g_data.find(name) != this->g_data.end();
81}
82template<class TData, class TDataBlock>
83bool BaseManager<TData, TDataBlock>::unload(std::string_view name)
84{
85 if (name.empty())
86 {
87 return false;
88 }
89
90 std::scoped_lock const lck(this->g_mutex);
91 auto it = this->g_data.find(name);
92
93 if (it != this->g_data.end())
94 {
95 it->second->_valid = false;
96 it->second->_ptr = this->_g_badElement->_ptr;
97 it->second->unload();
98 this->g_data.erase(it);
99 return true;
100 }
101 return false;
102}
103template<class TData, class TDataBlock>
104void BaseManager<TData, TDataBlock>::unloadAll()
105{
106 std::scoped_lock const lck(this->g_mutex);
107
108 for (auto& data: this->g_data)
109 {
110 data.second->_valid = false;
111 data.second->_ptr = this->_g_badElement->_ptr;
112 data.second->unload();
113 }
114 this->g_data.clear();
115}
116template<class TData, class TDataBlock>
117bool BaseManager<TData, TDataBlock>::push(std::string_view name, DataBlockPointer block)
118{
119 if (name.empty() || !block || !block->_ptr)
121 return false;
122 }
123
124 if (this->contains(name))
125 {
126 return false;
127 }
128
129 std::scoped_lock const lck(this->g_mutex);
130 this->g_data.emplace(name, std::move(block));
131 return true;
132}
133
134//BaseDataAccessor
135
136template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
138 g_data(TDataAccessorManagerInfo()().getBadElement()),
139 g_name(FGE_MANAGER_BAD)
140{}
141template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
143 g_data(TDataAccessorManagerInfo()().getElement(name)),
144 g_name(name)
146template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
148 g_data(TDataAccessorManagerInfo()().getElement(name)),
149 g_name(name)
150{}
151template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
152BaseDataAccessor<TDataAccessorManagerInfo, TOption>::BaseDataAccessor(std::string name) :
153 g_data(TDataAccessorManagerInfo()().getElement(name)),
154 g_name(std::move(name))
155{}
156template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
158 g_data(std::move(data)),
159 g_name(FGE_MANAGER_BAD)
160{}
161template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
163 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
164 :
165 g_data(std::move(data)),
166 g_name(FGE_MANAGER_BAD)
167{}
168
169template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
171{
172 this->g_data = TDataAccessorManagerInfo()().getBadElement();
173 this->g_name = FGE_MANAGER_BAD;
174}
175
176template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
178{
179 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
180}
181
182template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
184{
185 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
186 {
187 return this->g_data->_valid;
188 }
189 else
190 {
191 if (std::holds_alternative<SharedDataType>(this->g_data))
192 {
193 return std::get<SharedDataType>(this->g_data)->_valid;
194 }
195 return static_cast<bool>(std::get<SharedType>(this->g_data));
196 }
197}
198
199template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
200typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedDataType const&
202{
203 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
204 {
205 return this->g_data;
206 }
207 else
208 {
209 if (std::holds_alternative<SharedDataType>(this->g_data))
210 {
211 return std::get<SharedDataType>(this->g_data);
212 }
213 return TDataAccessorManagerInfo()().getBadElement();
214 }
215}
216template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
217typename BaseDataAccessor<TDataAccessorManagerInfo, TOption>::SharedType const&
219 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
220{
221 if (std::holds_alternative<SharedDataType>(this->g_data))
222 {
223 return std::get<SharedDataType>(this->g_data)->_ptr;
224 }
225
226 if (std::get<SharedType>(this->g_data))
227 {
228 return std::get<SharedType>(this->g_data);
229 }
230 return TDataAccessorManagerInfo()().getBadElement()->_ptr;
231}
232template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
234{
235 return this->g_name;
236}
238template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
240{
241 if (this->g_name == name)
242 {
243 return *this;
244 }
245
246 this->g_name = name;
247 this->g_data = TDataAccessorManagerInfo()().getElement(name);
248 return *this;
249}
250template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
252{
253 if (this->g_name == name)
254 {
255 return *this;
256 }
257
258 this->g_name = name;
259 this->g_data = TDataAccessorManagerInfo()().getElement(name);
260 return *this;
261}
262template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
264{
265 if (this->g_name == name)
267 return *this;
268 }
269
270 this->g_name = std::move(name);
271 this->g_data = TDataAccessorManagerInfo()().getElement(this->g_name);
272 return *this;
273}
274template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
275auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedDataType data)
276{
277 this->g_name = FGE_MANAGER_BAD;
278 this->g_data = std::move(data);
279 return *this;
280}
281template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
282auto& BaseDataAccessor<TDataAccessorManagerInfo, TOption>::operator=(SharedType data)
283 requires(TOption == DataAccessorOptions::ALLOW_VARIANT_OF_DATAPOINTER_AND_BLOCKPOINTER)
284{
285 this->g_name = FGE_MANAGER_BAD;
286 this->g_data = std::move(data);
287 return *this;
288}
289
290template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
291typename TDataAccessorManagerInfo::Manager::DataType* BaseDataAccessor<TDataAccessorManagerInfo, TOption>::retrieve()
292{
293 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
294 {
295 return this->g_data->_ptr.get();
296 }
297 else
298 {
299 if (std::holds_alternative<SharedDataType>(this->g_data))
300 {
301 return std::get<SharedDataType>(this->g_data)->_ptr.get();
302 }
303
304 if (std::get<SharedType>(this->g_data))
305 {
306 return std::get<SharedType>(this->g_data).get();
307 }
308 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
309 }
310}
311template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
312typename TDataAccessorManagerInfo::Manager::DataType const*
314{
315 if constexpr (TOption == DataAccessorOptions::BLOCKPOINTER_ONLY)
316 {
317 return this->g_data->_ptr.get();
318 }
319 else
320 {
321 if (std::holds_alternative<SharedDataType>(this->g_data))
322 {
323 return std::get<SharedDataType>(this->g_data)->_ptr.get();
324 }
325
326 if (std::get<SharedType>(this->g_data))
327 {
328 return std::get<SharedType>(this->g_data).get();
329 }
330 return TDataAccessorManagerInfo()().getBadElement()->_ptr.get();
331 }
332}
333
334template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
335static net::Packet const& operator>>(net::Packet const& pck, BaseDataAccessor<TDataAccessorManagerInfo, TOption>& data)
336{
337 std::string name;
338 pck >> name;
339 data = std::move(name);
340 return pck;
341}
342template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
343static net::Packet& operator<<(net::Packet& pck, BaseDataAccessor<TDataAccessorManagerInfo, TOption> const& data)
344{
345 return pck << data.getName();
346}
347
348template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
349static void to_json(nlohmann::json& j, BaseDataAccessor<TDataAccessorManagerInfo, TOption> const& p)
350{
351 j = p.getName();
352}
353template<class TDataAccessorManagerInfo, DataAccessorOptions TOption>
354static void from_json(nlohmann::json const& j, BaseDataAccessor<TDataAccessorManagerInfo, TOption>& p)
355{
356 std::string name;
357 j.get_to(name);
358 p = std::move(name);
359}
360
361} // 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: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