diff --git a/core/include/Data/ArrayData.h b/core/include/Data/ArrayData.h index db0677b..226bc18 100644 --- a/core/include/Data/ArrayData.h +++ b/core/include/Data/ArrayData.h @@ -49,11 +49,20 @@ struct IteratorValueBuilder { template struct IteratorValueBuilder { using DataContainerIterator = DataContainer::const_iterator; + + static void swap(IteratorValue &o1, IteratorValue &o2) {} }; template struct IteratorValueBuilder { using DataContainerIterator = DataContainer::iterator; + + static void swap(IteratorValue &o1, IteratorValue &o2) + { + for (auto i = 0; i < o1.m_NbComponents; ++i) { + std::iter_swap(o1.m_It + i, o2.m_It + i); + } + } }; template @@ -127,6 +136,12 @@ public: return result; } + void swap(ArrayDataIteratorValue::Impl &other) override + { + auto &otherImpl = dynamic_cast(other); + IteratorValueBuilder::swap(*this, otherImpl); + } + private: DataContainerIterator m_It; int m_NbComponents; diff --git a/core/include/Data/ArrayDataIterator.h b/core/include/Data/ArrayDataIterator.h index fa86409..791b473 100644 --- a/core/include/Data/ArrayDataIterator.h +++ b/core/include/Data/ArrayDataIterator.h @@ -27,11 +27,12 @@ public: virtual double min() const = 0; virtual double max() const = 0; virtual QVector values() const = 0; + + virtual void swap(Impl &other) = 0; }; explicit ArrayDataIteratorValue(std::unique_ptr impl); ArrayDataIteratorValue(const ArrayDataIteratorValue &other); - ArrayDataIteratorValue(ArrayDataIteratorValue &&other) = default; ArrayDataIteratorValue &operator=(ArrayDataIteratorValue other); bool equals(const ArrayDataIteratorValue &other) const; @@ -51,6 +52,13 @@ public: /// Gets all values QVector values() const; + Impl *impl(); + + friend void swap(ArrayDataIteratorValue &lhs, ArrayDataIteratorValue &rhs) + { + std::swap(lhs.m_Impl, rhs.m_Impl); + } + private: std::unique_ptr m_Impl; }; diff --git a/core/include/Data/DataSeries.h b/core/include/Data/DataSeries.h index 9433ebd..8ab0160 100644 --- a/core/include/Data/DataSeries.h +++ b/core/include/Data/DataSeries.h @@ -81,6 +81,13 @@ public: double maxValue() const override { return m_ValuesIt->max(); } QVector values() const override { return m_ValuesIt->values(); } + void swap(DataSeriesIteratorValue::Impl &other) override + { + auto &otherImpl = dynamic_cast(other); + m_XIt->impl()->swap(*otherImpl.m_XIt->impl()); + m_ValuesIt->impl()->swap(*otherImpl.m_ValuesIt->impl()); + } + private: ArrayDataIterator m_XIt; ArrayDataIterator m_ValuesIt; diff --git a/core/include/Data/DataSeriesIterator.h b/core/include/Data/DataSeriesIterator.h index fd859bb..be513b0 100644 --- a/core/include/Data/DataSeriesIterator.h +++ b/core/include/Data/DataSeriesIterator.h @@ -29,11 +29,12 @@ public: virtual double minValue() const = 0; virtual double maxValue() const = 0; virtual QVector values() const = 0; + + virtual void swap(Impl &other) = 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; @@ -55,6 +56,13 @@ public: /// Gets all values data QVector values() const; + Impl *impl(); + + friend void swap(DataSeriesIteratorValue &lhs, DataSeriesIteratorValue &rhs) + { + std::swap(lhs.m_Impl, rhs.m_Impl); + } + private: std::unique_ptr m_Impl; }; diff --git a/core/include/Data/SqpIterator.h b/core/include/Data/SqpIterator.h index b1d5cc3..be7e79f 100644 --- a/core/include/Data/SqpIterator.h +++ b/core/include/Data/SqpIterator.h @@ -22,9 +22,7 @@ public: virtual ~SqpIterator() noexcept = default; SqpIterator(const SqpIterator &) = default; - SqpIterator(SqpIterator &&) = default; - SqpIterator &operator=(const SqpIterator &) = default; - SqpIterator &operator=(SqpIterator &&) = default; + SqpIterator &operator=(SqpIterator other) { swap(m_CurrentValue, other.m_CurrentValue); } SqpIterator &operator++() { diff --git a/core/src/Data/ArrayDataIterator.cpp b/core/src/Data/ArrayDataIterator.cpp index cd397c4..c7e7a9b 100644 --- a/core/src/Data/ArrayDataIterator.cpp +++ b/core/src/Data/ArrayDataIterator.cpp @@ -12,7 +12,7 @@ ArrayDataIteratorValue::ArrayDataIteratorValue(const ArrayDataIteratorValue &oth ArrayDataIteratorValue &ArrayDataIteratorValue::operator=(ArrayDataIteratorValue other) { - std::swap(m_Impl, other.m_Impl); + m_Impl->swap(*other.m_Impl); return *this; } @@ -55,3 +55,8 @@ QVector ArrayDataIteratorValue::values() const { return m_Impl->values(); } + +ArrayDataIteratorValue::Impl *ArrayDataIteratorValue::impl() +{ + return m_Impl.get(); +} diff --git a/core/src/Data/DataSeriesIterator.cpp b/core/src/Data/DataSeriesIterator.cpp index d492b32..62e33b9 100644 --- a/core/src/Data/DataSeriesIterator.cpp +++ b/core/src/Data/DataSeriesIterator.cpp @@ -13,7 +13,7 @@ DataSeriesIteratorValue::DataSeriesIteratorValue(const DataSeriesIteratorValue & DataSeriesIteratorValue &DataSeriesIteratorValue::operator=(DataSeriesIteratorValue other) { - std::swap(m_Impl, other.m_Impl); + m_Impl->swap(*other.m_Impl); return *this; } @@ -61,3 +61,8 @@ QVector DataSeriesIteratorValue::values() const { return m_Impl->values(); } + +DataSeriesIteratorValue::Impl *DataSeriesIteratorValue::impl() +{ + return m_Impl.get(); +}