@@ -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+
229249template < typename INT_T, typename DATA_T,
230250 typename ALLOC_T = std::allocator<DATA_T> >
231251class IntArrayMultiMap
@@ -244,24 +264,6 @@ class IntArrayMultiMap
244264
245265public:
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 {
0 commit comments