MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ extract_segments_data()

template<typename T >
std::vector< std::vector< T > > MayaFlux::Kakshya::extract_segments_data ( const std::vector< RegionSegment > &  segments,
const std::vector< std::span< const T > > &  source_spans,
const std::vector< DataDimension > &  dimensions,
OrganizationStrategy  organization 
)

Extract data for multiple segments from multi-channel source data.

Template Parameters
TData type.
Parameters
segmentsVector of region segments to extract.
source_spansVector of source data spans (one per channel).
dimensionsDimension descriptors.
organizationStorage organization strategy.
Returns
Vector of vectors, each containing extracted data for one segment.

Definition at line 197 of file RegionUtils.hpp.

202{
203 if (source_spans.size() != 1) {
204 throw std::invalid_argument("Source spans cannot be empty");
205 }
206
207 std::vector<std::vector<T>> result;
208
209 for (const auto& segment : segments) {
210 if (segment.is_cached && !segment.cache.data.empty()) {
211 for (const auto& variant : segment.cache.data) {
212 std::vector<T> converted;
213 auto span = extract_from_variant<T>(variant, converted);
214 std::vector<T> cached_data(span.begin(), span.end());
215
216 if (organization == OrganizationStrategy::INTERLEAVED) {
217 if (result.empty())
218 result.resize(1);
219 std::ranges::copy(cached_data, std::back_inserter(result[0]));
220 } else {
221 if (result.size() <= result.size())
222 result.resize(result.size() + 1);
223 result.back() = std::move(cached_data);
224 }
225 }
226 } else {
227 auto region_data = extract_region_data<T>(source_spans, segment.source_region, dimensions, organization);
228
229 if (organization == OrganizationStrategy::INTERLEAVED) {
230 if (result.empty())
231 result.resize(1);
232 std::ranges::copy(region_data[0], std::back_inserter(result[0]));
233 } else {
234 if (result.empty())
235 result.resize(region_data.size());
236 for (size_t i = 0; i < region_data.size(); ++i) {
237 std::ranges::copy(region_data[i], std::back_inserter(result[i]));
238 }
239 }
240 }
241 }
242
243 return result;
244}

References INTERLEAVED.