14 static constexpr Index INVALID_INDEX = std::numeric_limits<Index>::max();
16 bool Has(Index
id)
const
18 return id < m_Sparse.size() && m_Sparse[id] != INVALID_INDEX && m_Sparse[id] < m_Dense.size() &&
19 m_Dense[m_Sparse[id]].id == id;
22 void Insert(Index
id,
const T& value)
24 if (
id >= m_Sparse.size())
26 m_Sparse.resize(
id + 1, INVALID_INDEX);
31 m_Dense[m_Sparse[id]].data = value;
35 m_Sparse[id] =
static_cast<Index
>(m_Dense.size());
36 m_Dense.push_back({ id, value });
47 Index denseIdx = m_Sparse[id];
48 auto lastIdx =
static_cast<Index
>(m_Dense.size() - 1);
50 if (denseIdx != lastIdx)
52 std::swap(m_Dense[denseIdx], m_Dense[lastIdx]);
53 m_Sparse[m_Dense[denseIdx].id] = denseIdx;
57 m_Sparse[id] = INVALID_INDEX;
63 return m_Dense[m_Sparse[id]].data;
66 const T& Get(Index
id)
const
69 return m_Dense[m_Sparse[id]].data;
72 std::vector<T> Values()
const
75 for (
const auto& pair : m_Dense)
77 out.push_back(pair.data);
82 std::vector<Index> Keys()
const
84 std::vector<Index> out;
85 for (
const auto& pair : m_Dense)
87 out.push_back(pair.id);
98 [[nodiscard]]
size_t Size()
const
100 return m_Dense.size();
102 [[nodiscard]]
bool Empty()
const
104 return m_Dense.empty();
115 return m_Dense.begin();
119 return m_Dense.end();
123 return m_Dense.begin();
127 return m_Dense.end();
131 std::vector<Index> m_Sparse;
132 std::vector<Entry> m_Dense;
Definition SparseSet.hpp:108