#ifndef SCIQLOP_DATASERIESITERATOR_H #define SCIQLOP_DATASERIESITERATOR_H #include "CoreGlobal.h" #include /** * @brief The DataSeriesIteratorValue class represents the current value of a data series iterator. * It offers standard access methods for the data in the series (x-axis, values), but it is up to * each series to define its own implementation of how to retrieve this data, by implementing the * DataSeriesIteratorValue::Impl interface * * @sa DataSeriesIterator */ class SCIQLOP_CORE_EXPORT DataSeriesIteratorValue { public: struct Impl { virtual ~Impl() noexcept = default; virtual std::unique_ptr clone() const = 0; virtual bool equals(const Impl &other) const = 0; virtual void next() = 0; virtual void prev() = 0; virtual double x() const = 0; virtual double value() const = 0; virtual double value(int componentIndex) const = 0; virtual double minValue() const = 0; virtual double maxValue() const = 0; }; explicit DataSeriesIteratorValue(std::unique_ptr impl); DataSeriesIteratorValue(const DataSeriesIteratorValue &other); DataSeriesIteratorValue(DataSeriesIteratorValue &&other) = default; DataSeriesIteratorValue &operator=(DataSeriesIteratorValue other); bool equals(const DataSeriesIteratorValue &other) const; /// Advances to the next value void next(); /// Moves back to the previous value void prev(); /// Gets x-axis data double x() const; /// Gets value data double value() const; /// Gets value data depending on an index double value(int componentIndex) const; /// Gets min of all values data double minValue() const; /// Gets max of all values data double maxValue() const; private: std::unique_ptr m_Impl; }; /** * @brief The DataSeriesIterator class represents an iterator used for data series. It defines all * operators needed for a standard forward iterator * @sa http://www.cplusplus.com/reference/iterator/ */ class SCIQLOP_CORE_EXPORT DataSeriesIterator { public: using iterator_category = std::forward_iterator_tag; using value_type = const DataSeriesIteratorValue; using difference_type = std::ptrdiff_t; using pointer = value_type *; using reference = value_type &; explicit DataSeriesIterator(DataSeriesIteratorValue value); virtual ~DataSeriesIterator() noexcept = default; DataSeriesIterator(const DataSeriesIterator &) = default; DataSeriesIterator(DataSeriesIterator &&) = default; DataSeriesIterator &operator=(const DataSeriesIterator &) = default; DataSeriesIterator &operator=(DataSeriesIterator &&) = default; DataSeriesIterator &operator++(); DataSeriesIterator &operator--(); pointer operator->() const { return &m_CurrentValue; } reference operator*() const { return m_CurrentValue; } bool operator==(const DataSeriesIterator &other) const; bool operator!=(const DataSeriesIterator &other) const; private: DataSeriesIteratorValue m_CurrentValue; }; #endif // SCIQLOP_DATASERIESITERATOR_H