Extract a sample range from a single series.
region.start_coordinates[0] = series index. region.start_coordinates[1] = first sample (inclusive). region.end_coordinates[1] = last sample (inclusive).
Returns a single DataVariant containing vector<double> of the slice. Returns empty if coordinates are out of range.
227{
228 if (region.start_coordinates.empty() || region.end_coordinates.empty())
229 return {};
230
231 const auto series_idx = static_cast<size_t>(region.start_coordinates[0]);
232 if (series_idx >=
m_data.size())
233 return {};
234
235 std::optional<std::vector<DataVariant>> result;
237 const auto* src = std::get_if<std::vector<double>>(&
m_data[series_idx]);
238 if (!src || src->empty())
239 return;
240 const uint64_t s = (region.start_coordinates.size() > 1) ? region.start_coordinates[1] : 0;
241 const uint64_t e = (region.end_coordinates.size() > 1)
242 ? std::min(region.end_coordinates[1], static_cast<uint64_t>(src->size() - 1))
243 : static_cast<uint64_t>(src->size() - 1);
244 if (s > e)
245 return;
246 std::vector<double>
slice(src->begin() +
static_cast<ptrdiff_t
>(s),
247 src->begin() + static_cast<ptrdiff_t>(e + 1));
249 });
250
251 return result.value_or(std::vector<DataVariant> {});
252}
std::vector< DataVariant > m_data
Memory::SeqlockArray m_series_locks
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
std::vector< double > slice(std::span< const double > data, double start_ratio, double end_ratio)
Extract a contiguous slice by ratio, returning a new vector.
bool seqlock_read_void(const Seqlock &lock, uint32_t max_attempts, Fn &&fn)
Invoke a void read functor under a Seqlock with a bounded retry count.