From 09db2d1144f040c8920020e2e6c1b4cc102481fc 2017-08-31 10:28:46 From: Alexandre Leroux Date: 2017-08-31 10:28:46 Subject: [PATCH] Adapts SqpIterator to make non-const iterators --- diff --git a/core/include/Data/ArrayData.h b/core/include/Data/ArrayData.h index 6a149e2..db0677b 100644 --- a/core/include/Data/ArrayData.h +++ b/core/include/Data/ArrayData.h @@ -39,19 +39,49 @@ struct Sort<1> { } }; +template +class IteratorValue; + +template +struct IteratorValueBuilder { +}; + +template +struct IteratorValueBuilder { + using DataContainerIterator = DataContainer::const_iterator; +}; + template +struct IteratorValueBuilder { + using DataContainerIterator = DataContainer::iterator; +}; + +template class IteratorValue : public ArrayDataIteratorValue::Impl { public: + friend class ArrayData; + friend class IteratorValueBuilder; + + using DataContainerIterator = + typename IteratorValueBuilder::DataContainerIterator; + + template > explicit IteratorValue(const DataContainer &container, int nbComponents, bool begin) : m_It{begin ? container.cbegin() : container.cend()}, m_NbComponents{nbComponents} { } + template > + explicit IteratorValue(DataContainer &container, int nbComponents, bool begin) + : m_It{begin ? container.begin() : container.end()}, m_NbComponents{nbComponents} + { + } + IteratorValue(const IteratorValue &other) = default; std::unique_ptr clone() const override { - return std::make_unique >(*this); + return std::make_unique >(*this); } bool equals(const ArrayDataIteratorValue::Impl &other) const override try { @@ -98,7 +128,7 @@ public: } private: - DataContainer::const_iterator m_It; + DataContainerIterator m_It; int m_NbComponents; }; @@ -223,15 +253,31 @@ public: // Iterators // // ///////// // + ArrayDataIterator begin() + { + return ArrayDataIterator{ + ArrayDataIteratorValue{std::make_unique >( + m_Data, m_NbComponents, true)}}; + } + + ArrayDataIterator end() + { + return ArrayDataIterator{ + ArrayDataIteratorValue{std::make_unique >( + m_Data, m_NbComponents, false)}}; + } + ArrayDataIterator cbegin() const { - return ArrayDataIterator{ArrayDataIteratorValue{ - std::make_unique >(m_Data, m_NbComponents, true)}}; + return ArrayDataIterator{ + ArrayDataIteratorValue{std::make_unique >( + m_Data, m_NbComponents, true)}}; } + ArrayDataIterator cend() const { return ArrayDataIterator{ - ArrayDataIteratorValue{std::make_unique >( + ArrayDataIteratorValue{std::make_unique >( m_Data, m_NbComponents, false)}}; } diff --git a/core/include/Data/DataSeries.h b/core/include/Data/DataSeries.h index bfa12c9..9433ebd 100644 --- a/core/include/Data/DataSeries.h +++ b/core/include/Data/DataSeries.h @@ -27,20 +27,31 @@ class DataSeries; namespace dataseries_detail { -template +template class IteratorValue : public DataSeriesIteratorValue::Impl { public: + friend class DataSeries; + + template > + explicit IteratorValue(DataSeries &dataSeries, bool begin) + : m_XIt(begin ? dataSeries.xAxisData()->begin() : dataSeries.xAxisData()->end()), + m_ValuesIt(begin ? dataSeries.valuesData()->begin() : dataSeries.valuesData()->end()) + { + } + + template > explicit IteratorValue(const DataSeries &dataSeries, bool begin) : m_XIt(begin ? dataSeries.xAxisData()->cbegin() : dataSeries.xAxisData()->cend()), m_ValuesIt(begin ? dataSeries.valuesData()->cbegin() : dataSeries.valuesData()->cend()) { } + IteratorValue(const IteratorValue &other) = default; std::unique_ptr clone() const override { - return std::make_unique >(*this); + return std::make_unique >(*this); } bool equals(const DataSeriesIteratorValue::Impl &other) const override try { @@ -149,16 +160,28 @@ public: // Iterators // // ///////// // + DataSeriesIterator begin() override + { + return DataSeriesIterator{DataSeriesIteratorValue{ + std::make_unique >(*this, true)}}; + } + + DataSeriesIterator end() override + { + return DataSeriesIterator{DataSeriesIteratorValue{ + std::make_unique >(*this, false)}}; + } + DataSeriesIterator cbegin() const override { return DataSeriesIterator{DataSeriesIteratorValue{ - std::make_unique >(*this, true)}}; + std::make_unique >(*this, true)}}; } DataSeriesIterator cend() const override { return DataSeriesIterator{DataSeriesIteratorValue{ - std::make_unique >(*this, false)}}; + std::make_unique >(*this, false)}}; } /// @sa IDataSeries::minXAxisData() diff --git a/core/include/Data/IDataSeries.h b/core/include/Data/IDataSeries.h index 33fc095..8414af8 100644 --- a/core/include/Data/IDataSeries.h +++ b/core/include/Data/IDataSeries.h @@ -69,6 +69,8 @@ public: virtual DataSeriesIterator cbegin() const = 0; virtual DataSeriesIterator cend() const = 0; + virtual DataSeriesIterator begin() = 0; + virtual DataSeriesIterator end() = 0; /// @return the iterator to the first entry of the data series whose x-axis data is greater than /// or equal to the value passed in parameter, or the end iterator if there is no matching value diff --git a/core/include/Data/SqpIterator.h b/core/include/Data/SqpIterator.h index 8b51389..b1d5cc3 100644 --- a/core/include/Data/SqpIterator.h +++ b/core/include/Data/SqpIterator.h @@ -38,8 +38,10 @@ public: return *this; } - pointer operator->() const { return &m_CurrentValue; } - reference operator*() const { return m_CurrentValue; } + const T *operator->() const { return &m_CurrentValue; } + const T &operator*() const { return m_CurrentValue; } + T *operator->() { return &m_CurrentValue; } + T &operator*() { return m_CurrentValue; } bool operator==(const SqpIterator &other) const {