9 constexpr static index_t default_index = std::numeric_limits<index_t>::max();
10 constexpr static index_t INVALID_INDEX = default_index;
11 using index_type = index_t;
12 using value_type =
typename container_t::value_type;
15 std::vector<index_t> sparse_set{ default_index };
18 std::vector<index_t> reverse_map;
19 using const_iterator =
typename decltype(dense_set)::const_iterator_type;
21 template<
typename ... A>
22 inline void Emplace(index_t
sparse_index, A&& ... args) {
25 dense_set.emplace(args...);
39 dense_set.erase(dense_set.begin() +
denseidx);
44 reverse_map[
denseidx] = reverse_map.back();
46 reverse_map.pop_back();
59 inline bool HasForSparseIndex(index_t
sparse_index)
const {
64 return dense_set.begin();
68 return dense_set.end();
72 return dense_set.begin();
76 return dense_set.end();
80 value_type& Get(index_t idx) {
81 return dense_set[idx];
85 index_t& GetSparseIndexForDense(index_t idx) {
86 return reverse_map[idx];
89 const value_type& Get(index_t idx)
const {
93 auto DenseSize()
const {
94 return dense_set.size();
97 auto GetDenseData()
const {
98 return dense_set.data();
101 inline auto& GetDense() {