#ifndef PROC_NODES_OFFSET_INDICES_H
#define PROC_NODES_OFFSET_INDICES_H
#include <godot_cpp/variant/packed_int32_array.hpp>
namespace godot {
// Maps N groups to contiguous ranges in a flat array.
// offsets[i] = start of group i, offsets[N] = total element count (sentinel).
// Group i contains elements [offsets[i], offsets[i+1]).
class OffsetIndices {
PackedInt32Array offsets;
public:
OffsetIndices() = default;
explicit OffsetIndices(const PackedInt32Array &p_offsets) :
offsets(p_offsets) {}
// Build from per-group sizes
static OffsetIndices from_sizes(const PackedInt32Array &p_sizes) {
PackedInt32Array offs;
offs.resize(p_sizes.size() + 1);
int32_t *w = offs.ptrw();
w[0] = 0;
const int32_t *s = p_sizes.ptr();
for (int i = 0; i < p_sizes.size(); i++) {
w[i + 1] = w[i] + s[i];
}
return OffsetIndices(offs);
}
int group_count() const {
return offsets.size() > 0 ? offsets.size() - 1 : 0;
}
int total_size() const {
return offsets.size() > 0 ? offsets[offsets.size() - 1] : 0;
}
int group_start(int p_group) const {
return offsets[p_group];
}
int group_end(int p_group) const {
return offsets[p_group + 1];
}
int group_size(int p_group) const {
return offsets[p_group + 1] - offsets[p_group];
}
const PackedInt32Array &raw() const { return offsets; }
};
} // namespace godot
#endif // PROC_NODES_OFFSET_INDICES_H