#pragma once #include "../stl_alias.hpp" struct flat_index_group { stl_vector_mp index_group{}; /// a list of indices in the group stl_vector_mp 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 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 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 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]); } } };