Extract data for multiple segments from multi-channel source data.
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}