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,
139 return a.start_coordinates[dimension_index] < b.start_coordinates[dimension_index];
151 std::ranges::sort(regions,
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 for (
const auto& region : regions) {
215 auto it = region.attributes.find(key);
216 if (it != region.attributes.end()) {
218 if (it->second.type() == value.type()) {
219 if (value.type() ==
typeid(std::string)) {
220 if (std::any_cast<std::string>(it->second) == std::any_cast<std::string>(value)) {
221 result.push_back(region);
223 }
else if (value.type() ==
typeid(double)) {
224 if (std::any_cast<double>(it->second) == std::any_cast<double>(value)) {
225 result.push_back(region);
227 }
else if (value.type() ==
typeid(int)) {
228 if (std::any_cast<int>(it->second) == std::any_cast<int>(value)) {
229 result.push_back(region);
231 }
else if (value.type() ==
typeid(bool)) {
232 if (std::any_cast<bool>(it->second) == std::any_cast<bool>(value)) {
233 result.push_back(region);
237 }
catch (
const std::bad_any_cast&) {
251 std::vector<Region> result;
252 for (
const auto& region : regions) {
253 if (region.contains(coordinates)) {
254 result.push_back(region);
266 template <
typename T>
269 attributes[key] = std::move(value);
278 template <
typename T>
281 auto it = attributes.find(key);
282 if (it == attributes.end()) {
286 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::optional< T > get_attribute(const std::string &key) const
Get an attribute value by key, with type conversion support.
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Represents a point or span in N-dimensional space.