R-Type  1.0.1.0
Rewrite of the R-Type game with networking ability
Loading...
Searching...
No Matches
SparseArray.hpp
1/*
2** EPITECH PROJECT, 2023
3** SparseArray.hpp
4** File description:
5** SparseArray.hpp
6*/
7
8#ifndef URANUS_SPARSEARRAY_HPP
9#define URANUS_SPARSEARRAY_HPP
10
11#include "uranus/Core.hpp"
12#include <memory>
13#include <optional>
14#include <vector>
15
19namespace uranus::ecs {
24 template<typename Component>
26 public:
27 using ValueType = std::shared_ptr<Component>;
28 using ReferenceType = ValueType &;
29 using ConstReferenceType = const ValueType &;
30 using Container = std::vector<ValueType>;
31 using SizeType = typename Container::size_type;
32 using Iterator = typename Container::iterator;
33 using ConstIterator = typename Container::const_iterator;
34
38 SparseArray() = default;
39
44 SparseArray(const SparseArray &) = default;
45
50 SparseArray(SparseArray &&) noexcept = default;
51
55 ~SparseArray() = default;
56
63 SparseArray &operator=(const SparseArray &);
64
71 SparseArray &operator=(SparseArray &&) noexcept;
72
79 ReferenceType operator[](std::size_t idx);
80
87 ConstReferenceType operator[](std::size_t idx) const;
88
94 Iterator begin();
95
101 ConstIterator begin() const;
102
108 ConstIterator cbegin() const;
109
115 Iterator end();
116
122 ConstIterator end() const;
123
129 ConstIterator cend() const;
130
136 SizeType size() const;
137
145 ReferenceType insertAt(SizeType pos, const Component &);
146
155 ReferenceType insertAt(SizeType pos, Component &&);
156
165 template<class... Params>
166 ReferenceType emplaceAt(SizeType pos, Params &&...params);
167
173 void erase(SizeType pos);
174
181 std::optional<SizeType> getIndex(const ValueType &) const;
182
187 Container &getData() const;
188
189 private:
190 Container _data;
191 };
192
193 template<typename Component>
194 SparseArray<Component> &SparseArray<Component>::operator=(const SparseArray<Component> &other)
195 {
196 _data = other._data;
197 return *this;
198 }
199
200 template<typename Component>
202 {
203 _data = std::move(other._data);
204 return *this;
205 }
206
207 template<typename Component>
208 typename SparseArray<Component>::ReferenceType SparseArray<Component>::operator[](std::size_t idx)
209 {
210 if (idx >= _data.size()) _data.resize(idx + 1);
211 return _data[idx];
212 }
213
214 template<typename Component>
215 typename SparseArray<Component>::ConstReferenceType SparseArray<Component>::operator[](std::size_t idx) const
216 {
217 if (idx >= _data.size()) return nullptr;
218 return _data[idx];
219 }
220
221 template<typename Component>
222 typename SparseArray<Component>::Iterator SparseArray<Component>::begin()
223 {
224 return _data.begin();
225 }
226
227 template<typename Component>
228 typename SparseArray<Component>::ConstIterator SparseArray<Component>::begin() const
229 {
230 return _data.begin();
231 }
232
233 template<typename Component>
234 typename SparseArray<Component>::ConstIterator SparseArray<Component>::cbegin() const
235 {
236 return _data.cbegin();
237 }
238
239 template<typename Component>
240 typename SparseArray<Component>::Iterator SparseArray<Component>::end()
241 {
242 return _data.end();
243 }
244
245 template<typename Component>
246 typename SparseArray<Component>::ConstIterator SparseArray<Component>::end() const
247 {
248 return _data.end();
249 }
250
251 template<typename Component>
252 typename SparseArray<Component>::ConstIterator SparseArray<Component>::cend() const
253 {
254 return _data.cend();
255 }
256
257 template<typename Component>
258 typename SparseArray<Component>::SizeType SparseArray<Component>::size() const
259 {
260 return _data.size();
261 }
262
263 template<typename Component>
264 typename SparseArray<Component>::ReferenceType SparseArray<Component>::insertAt(SizeType pos, const Component &component)
265 {
266 if (pos >= _data.size()) _data.resize(pos + 1);
267 _data[pos] = std::make_shared<Component>(component);
268 return _data[pos];
269 }
270
271 template<typename Component>
272 typename SparseArray<Component>::ReferenceType SparseArray<Component>::insertAt(SizeType pos, Component &&component)
273 {
274 if (pos >= _data.size()) _data.resize(pos + 1);
275 _data[pos] = std::make_shared<Component>(std::move(component));
276 return _data[pos];
277 }
278
279 // TODO test this function
280 template<typename Component>
281 template<class... Params>
282 typename SparseArray<Component>::ReferenceType SparseArray<Component>::emplaceAt(SizeType pos, Params &&...params)
283 {
284 if (pos >= _data.size()) _data.resize(pos + 1);
285 _data[pos] = std::make_shared<Component>(std::forward<Params>(params)...);
286 return _data[pos];
287 }
288
289 template<typename Component>
291 {
292 if (pos >= _data.size()) return;
293 _data[pos] = nullptr;
294 }
295
296 template<typename Component>
297 std::optional<typename SparseArray<Component>::SizeType> SparseArray<Component>::getIndex(const ValueType &ptr) const
298 {
299 for (SizeType i = 0; i < _data.size(); i++) {
300 if (_data[i] && ptr) {
301 if (std::addressof(_data[i].get()) == std::addressof(ptr.get())) return i;
302 }
303 }
304 return std::nullopt;
305 }
306
307 template<typename Component>
308 typename SparseArray<Component>::Container &SparseArray<Component>::getData() const
309 {
310 return _data;
311 }
312} // namespace uranus::ecs
313#endif // URANUS_SPARSEARRAY_HPP
This file is used to include some core files of the engine.
SparseArray class, used to store components in a sparse way.
Definition: SparseArray.hpp:25
void erase(SizeType pos)
Erase the component at the given index.
Definition: SparseArray.hpp:290
Container & getData() const
Get the _data container.
Definition: SparseArray.hpp:308
SizeType size() const
Return the size of the SparseArray.
Definition: SparseArray.hpp:258
SparseArray(const SparseArray &)=default
Default copy constructor.
Iterator end()
Return the iterator pointing to the end of the SparseArray.
Definition: SparseArray.hpp:240
ReferenceType insertAt(SizeType pos, const Component &)
Insert a component at the given index.
Definition: SparseArray.hpp:264
std::optional< SizeType > getIndex(const ValueType &) const
Get the index of the entity possessing the given component.
Definition: SparseArray.hpp:297
SparseArray()=default
Default constructor.
ConstIterator cbegin() const
Return the const_iterator pointing to the beginning of the SparseArray.
Definition: SparseArray.hpp:234
SparseArray(SparseArray &&) noexcept=default
Default move constructor.
Container _data
Container of the components.
Definition: SparseArray.hpp:190
ReferenceType emplaceAt(SizeType pos, Params &&...params)
Emplace a component at the given index.
Definition: SparseArray.hpp:282
Iterator begin()
Return the iterator pointing to the beginning of the SparseArray.
Definition: SparseArray.hpp:222
SparseArray & operator=(const SparseArray &)
Copy assignment operator.
Definition: SparseArray.hpp:194
ConstIterator cend() const
Return the const_iterator pointing to the end of the SparseArray.
Definition: SparseArray.hpp:252
ReferenceType operator[](std::size_t idx)
Access the component at the given index, if it exists, otherwise resize the SparseArray.
Definition: SparseArray.hpp:208
Namespace containing all the ECS related classes.
Definition: Components.hpp:21