#pragma once #include #include #include namespace plot::data { /// Series over a uniform-dx sample vector. /// /// The vector is taken by value and owned from then on, so the caller cannot /// mutate the samples behind the series' back; the store changes only through /// reset() (a whole new vector) or commit(), which rebuilds the pyramid and the /// cached bounds for whatever y_ currently holds. class ArraySeries final : public Series { public: ArraySeries(std::vector y, f64 x0, f64 dx); /// Replaces samples and grid, then rebuilds derived state (== commit()). void reset(std::vector y, f64 x0, f64 dx); /// Rebuilds the pyramid and cached bounds from y_ as it stands now. void commit(); u64 size() const override; f64 x0() const override; f64 dx() const override; Range x_bounds() const override; Range y_bounds() const override; const MinMaxPyramid& pyramid() const override; void gather(u32 level, u64 begin, u64 end, std::vector& out_xy) const override; protected: void copy_raw(u64 begin, u64 end, f32* out) const override; private: std::vector y_; f64 x0_ = 0.0; f64 dx_ = 1.0; MinMaxPyramid pyramid_; Range x_bounds_{}; Range y_bounds_{}; }; } // namespace plot::data