Skip to content

Commit 2f29e1a

Browse files
Improve IntArrayMultiMap const access
1 parent 1687802 commit 2f29e1a

File tree

2 files changed

+38
-20
lines changed

2 files changed

+38
-20
lines changed

src/longeron/containers/intarray_multimap.hpp

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,26 @@ struct PartitionDescStl
226226
std::vector<DataSpan_t> m_idToData;
227227
};
228228

229+
// TODO: use std::span if C++20 is enabled
230+
template <typename DATA_T>
231+
class Span
232+
{
233+
public:
234+
Span(DATA_T* data, std::size_t size)
235+
: m_data(data)
236+
, m_size(size)
237+
{ }
238+
239+
constexpr std::size_t size() const noexcept { return m_size; }
240+
constexpr DATA_T& operator[](std::size_t i) const noexcept { return m_data[i]; }
241+
constexpr DATA_T* begin() const noexcept { return m_data; }
242+
constexpr DATA_T* end() const noexcept { return m_data + m_size; }
243+
244+
private:
245+
DATA_T* m_data;
246+
std::size_t m_size;
247+
};
248+
229249
template< typename INT_T, typename DATA_T,
230250
typename ALLOC_T = std::allocator<DATA_T> >
231251
class IntArrayMultiMap
@@ -244,24 +264,6 @@ class IntArrayMultiMap
244264

245265
public:
246266

247-
class Span
248-
{
249-
public:
250-
Span(DATA_T* data, std::size_t size)
251-
: m_data(data)
252-
, m_size(size)
253-
{ }
254-
255-
constexpr std::size_t size() const noexcept { return m_size; }
256-
constexpr DATA_T& operator[](partition_size_t i) const noexcept { return m_data[i]; }
257-
constexpr DATA_T* begin() const noexcept { return m_data; }
258-
constexpr DATA_T* end() const noexcept { return m_data + m_size; }
259-
260-
private:
261-
DATA_T* m_data;
262-
std::size_t m_size;
263-
};
264-
265267
IntArrayMultiMap() = default;
266268

267269
IntArrayMultiMap(INT_T dataCapacity, INT_T idCapacity)
@@ -298,7 +300,7 @@ class IntArrayMultiMap
298300
}
299301
}
300302

301-
bool contains(INT_T id)
303+
bool contains(INT_T id) const
302304
{
303305
if (! m_partitions.id_in_range(id))
304306
{
@@ -455,7 +457,17 @@ class IntArrayMultiMap
455457
std::destroy_n(&m_data[free.m_offset], free.m_size);
456458
}
457459

458-
Span operator[] (INT_T id) noexcept
460+
Span<DATA_T> operator[] (INT_T id) noexcept
461+
{
462+
if (!m_partitions.exists(id) || !m_partitions.id_in_range(id))
463+
{
464+
return {nullptr, 0};
465+
}
466+
DataSpan_t const &span = m_partitions.m_idToData[id];
467+
return {&m_data[span.m_offset], span.m_size};
468+
}
469+
470+
Span<DATA_T const> const operator[] (INT_T id) const noexcept
459471
{
460472
if (!m_partitions.exists(id) || !m_partitions.id_in_range(id))
461473
{

test/intarray_multimap.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ TEST(IntArrayMultiMap, Basic)
4747
// Packing should affect stored values
4848
EXPECT_EQ(multimap[0][0], 1.0f);
4949
EXPECT_EQ(multimap[2][1], 6.0f);
50+
51+
// const access
52+
auto const& multimapConst = multimap;
53+
54+
EXPECT_EQ(multimapConst[0][0], 1.0f);
55+
EXPECT_EQ(multimapConst[2][1], 6.0f);
5056
}
5157

5258
using Shared_t = std::shared_ptr<float>;

0 commit comments

Comments
 (0)