14 changed files with 136 additions and 75 deletions
@ -0,0 +1,39 @@ |
|||
#pragma once |
|||
|
|||
#include "../stl_alias.hpp" |
|||
|
|||
struct flat_index_group { |
|||
stl_vector_mp<uint32_t> index_group{}; /// a list of indices in the group
|
|||
stl_vector_mp<uint32_t> start_indices{}; /// a list of start indices for each group in the flat index group
|
|||
|
|||
inline size_t size() const { return start_indices.size() - 1; } |
|||
|
|||
// f(group_index, element_index_in_group, elemenet)
|
|||
template <typename F> |
|||
inline void foreach (F&& f) const |
|||
{ |
|||
for (uint32_t group_idx = 0; group_idx < size(); ++group_idx) { |
|||
for (uint32_t elem_idx = 0; elem_idx < start_indices[group_idx + 1] - start_indices[group_idx]; ++elem_idx) { |
|||
f(group_idx, elem_idx, index_group[start_indices[group_idx] + elem_idx]); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// f(group_index, group_start_index, group_end_index)
|
|||
template <typename F> |
|||
inline void group_foreach(F&& f) const |
|||
{ |
|||
for (uint32_t group_idx = 0; group_idx < size(); ++group_idx) { |
|||
f(group_idx, start_indices[group_idx], start_indices[group_idx + 1]); |
|||
} |
|||
} |
|||
|
|||
// f(element_index_in_group, element)
|
|||
template <typename F> |
|||
inline void loop_on_group(uint32_t group_idx, F&& f) const |
|||
{ |
|||
for (uint32_t elem_idx = 0; elem_idx < start_indices[group_idx + 1] - start_indices[group_idx]; ++elem_idx) { |
|||
f(elem_idx, index_group[start_indices[group_idx] + elem_idx]); |
|||
} |
|||
} |
|||
}; |
Loading…
Reference in new issue