OverviewFilesCommitsIssuesDocsReleasesPeers

proc-nodes / src / core / offset_indices.h

59 lines · c ref:
#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