24#ifndef STELLARLIB_ECS_SPARSE_STORAGE_HPP
25#define STELLARLIB_ECS_SPARSE_STORAGE_HPP
27#include <stellarlib/ecs/any_set.hpp>
28#include <stellarlib/ecs/sparse_map.hpp>
29#include <stellarlib/ext/utility.hpp>
36namespace stellarlib::ecs::internal
38class sparse_storage final
41 template <
typename ...T>
43 static constexpr auto ids() noexcept
44 -> std::conditional_t<1 < sizeof...(T), const std::array<std::uint16_t, sizeof...(T)> &, std::array<std::uint16_t, sizeof...(T)>>
46 if constexpr (1 <
sizeof...(T)) {
56 sparse_storage() noexcept;
59 constexpr sparse_storage(const sparse_storage &) noexcept = delete;
62 sparse_storage(sparse_storage &&) noexcept;
64 constexpr auto operator=(const sparse_storage &) noexcept
65 -> sparse_storage & = delete;
67 auto operator=(sparse_storage &&) noexcept
70 ~sparse_storage() noexcept;
74 constexpr auto at(const std::uint16_t
id) const noexcept
77 if (
const auto map{_maps.at(
id)}) {
78 return static_cast<const sparse_map<std::uint32_t, T> &
>(**map);
81 static const sparse_map<std::uint32_t, T> map{};
87 constexpr auto at(
const std::uint16_t
id)
noexcept
90 if (
const auto map{_maps.at(
id)}) {
91 return static_cast<sparse_map<std::uint32_t, T> &
>(**map);
94 _maps.insert(
id, std::make_unique<sparse_map<std::uint32_t, T>>());
95 return static_cast<sparse_map<std::uint32_t, T> &
>(*_maps.values().back());
100 constexpr auto operator[](
const std::uint16_t
id)
const noexcept
103 return static_cast<const sparse_map<std::uint32_t, T> &
>(*_maps[id]);
106 template <
typename T>
108 constexpr auto operator[](
const std::uint16_t
id)
noexcept
111 return static_cast<sparse_map<std::uint32_t, T> &
>(*_maps[id]);
114 void erase(std::uint32_t key)
const noexcept;
116 void clear() const noexcept;
119 sparse_map<std::uint16_t, std::unique_ptr<any_set<std::uint32_t>>> _maps;
constexpr auto scoped_typeid() noexcept
Generates a unique ID per type within a scope.
Definition utility.hpp:59