40 double transition_duration_ms = 0.0;
42 size_t current_region_index = 0;
59 std::vector<Region> regions = {},
60 std::unordered_map<std::string, std::any> attrs = {})
61 : name(
std::move(group_name))
62 , regions(
std::move(regions))
63 , attributes(
std::move(attrs))
89 regions.push_back(region);
99 if (index >= regions.size()) {
100 regions.push_back(region);
102 regions.insert(regions.begin() + index, region);
112 if (index < regions.size()) {
113 regions.erase(regions.begin() + index);
114 if (current_region_index >= regions.size() && !regions.empty()) {
115 current_region_index = regions.size() - 1;
126 current_region_index = 0;
127 active_indices.clear();
136 std::ranges::sort(regions,
138 if (dimension_index <
a.start_coordinates.size() && dimension_index <
b.start_coordinates.size()) {
139 return a.start_coordinates[dimension_index] < b.start_coordinates[dimension_index];
151 std::ranges::sort(regions,
153 auto a_val =
a.get_attribute<
double>(attr_name);
154 auto b_val =
b.get_attribute<
double>(attr_name);
156 return *a_val < *b_val;
168 std::vector<Region> result;
169 for (
const auto& region : regions) {
170 if (region.get_label() == label) {
171 result.push_back(region);
186 auto first = regions[0];
188 std::vector<uint64_t> max_coords = first.end_coordinates;
190 for (
const auto& region : regions) {
191 for (
size_t i = 0; i < min_coords.size(); i++) {
192 if (i < region.start_coordinates.size()) {
193 min_coords[i] = std::min<size_t>(min_coords[i], region.start_coordinates[i]);
194 max_coords[i] = std::max<size_t>(max_coords[i], region.end_coordinates[i]);
199 Region bounds(min_coords, max_coords);
213 std::vector<Region> result;
214 std::ranges::copy_if(regions, std::back_inserter(result),
215 [&key, &value](
const Region& region) {
218 if (it == region.
attributes.end() || it->second.type() != value.type())
221 if (value.type() ==
typeid(std::string))
222 return any_equal<std::string>(it->second, value);
223 if (value.type() ==
typeid(
double))
224 return any_equal<double>(it->second, value);
225 if (value.type() ==
typeid(
int))
226 return any_equal<int>(it->second, value);
227 if (value.type() ==
typeid(
bool))
228 return any_equal<bool>(it->second, value);
229 if (value.type() ==
typeid(
float))
230 return any_equal<float>(it->second, value);
231 if (value.type() ==
typeid(uint32_t))
232 return any_equal<uint32_t>(it->second, value);
233 if (value.type() ==
typeid(int64_t))
234 return any_equal<int64_t>(it->second, value);
235 if (value.type() ==
typeid(uint64_t))
236 return any_equal<uint64_t>(it->second, value);
249 std::vector<Region> result;
250 for (
const auto& region : regions) {
251 if (region.contains(coordinates)) {
252 result.push_back(region);
264 template <
typename T>
267 attributes[key] = std::move(value);
276 template <
typename T>
279 auto it = attributes.find(key);
280 if (it == attributes.end()) {
284 return safe_any_cast<T>(it->second);
RegionSelectionPattern
Describes how regions are selected for processing or playback.
RegionTransition
Describes how transitions between regions are handled.
RegionState
Processing state for regions.
std::unordered_map< std::string, std::any > attributes
Flexible key-value store for group-specific attributes.
void insert_region(size_t index, const Region ®ion)
Insert a region at a specific index.
std::vector< size_t > active_indices
std::function< void(const Region &, const Region &)> on_transition
void sort_by_attribute(const std::string &attr_name)
Sort regions by a specific attribute (numeric).
std::vector< Region > regions
Collection of regions belonging to this group.
void clear_regions()
Remove all regions from the group.
std::function< void(const Region &)> on_region_end
std::vector< Region > find_regions_containing_coordinates(const std::vector< uint64_t > &coordinates) const
Find all regions containing the given coordinates.
void set_attribute(const std::string &key, T value)
Set a group-level attribute.
void remove_region(size_t index)
Remove a region by index.
std::string name
Descriptive name of the group.
std::optional< T > get_attribute(const std::string &key) const
Get a group-level attribute.
std::vector< Region > find_regions_with_label(const std::string &label) const
Find all regions with a given label.
void add_region(const Region ®ion)
std::function< void(const Region &)> on_region_start
std::vector< Region > find_regions_with_attribute(const std::string &key, const std::any &value) const
Find all regions with a specific attribute value.
Region get_bounding_region() const
Get the bounding region that contains all regions in the group.
void sort_by_dimension(size_t dimension_index)
Sort region by a specific dimension.
RegionGroup(std::string group_name, std::vector< Region > regions={}, std::unordered_map< std::string, std::any > attrs={})
Construct a region group.
Organizes related signal regions into a categorized collection.
void set_attribute(const std::string &key, std::any value)
Set an attribute value by key.
std::unordered_map< std::string, std::any > attributes
Flexible key-value store for region-specific attributes.
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Represents a point or span in N-dimensional space.