From 710e631137a08948fc9458f663119c5e10b90a4c 2017-09-05 16:19:19 From: Alexandre Leroux Date: 2017-09-05 16:19:19 Subject: [PATCH] Improves random access iterator performance --- diff --git a/core/include/Data/ArrayData.h b/core/include/Data/ArrayData.h index a07dc93..a1aad29 100644 --- a/core/include/Data/ArrayData.h +++ b/core/include/Data/ArrayData.h @@ -121,13 +121,11 @@ public: std::unique_ptr advance(int offset) const override { auto result = clone(); - while (offset--) { - result->next(); - } + result->next(offset); return result; } - void next() override { std::advance(m_It, m_NbComponents); } + void next(int offset) override { std::advance(m_It, offset * m_NbComponents); } void prev() override { std::advance(m_It, -m_NbComponents); } double at(int componentIndex) const override { return *(m_It + componentIndex); } diff --git a/core/include/Data/ArrayDataIterator.h b/core/include/Data/ArrayDataIterator.h index 040f5f1..0bca05d 100644 --- a/core/include/Data/ArrayDataIterator.h +++ b/core/include/Data/ArrayDataIterator.h @@ -23,7 +23,7 @@ public: virtual bool equals(const Impl &other) const = 0; virtual bool lowerThan(const Impl &other) const = 0; virtual std::unique_ptr advance(int offset) const = 0; - virtual void next() = 0; + virtual void next(int offset) = 0; virtual void prev() = 0; virtual double at(int componentIndex) const = 0; virtual double first() const = 0; @@ -44,7 +44,7 @@ public: ArrayDataIteratorValue advance(int offset) const; /// Advances to the next value - void next(); + void next(int offset = 1); /// Moves back to the previous value void prev(); /// Gets value of a specified component diff --git a/core/include/Data/DataSeries.h b/core/include/Data/DataSeries.h index 7e4f998..63684ea 100644 --- a/core/include/Data/DataSeries.h +++ b/core/include/Data/DataSeries.h @@ -81,16 +81,14 @@ public: std::unique_ptr advance(int offset) const override { auto result = clone(); - while (offset--) { - result->next(); - } + result->next(offset); return result; } - void next() override + void next(int offset) override { - ++m_XIt; - ++m_ValuesIt; + m_XIt->next(offset); + m_ValuesIt->next(offset); } void prev() override diff --git a/core/include/Data/DataSeriesIterator.h b/core/include/Data/DataSeriesIterator.h index ae0f7fa..a6b1f05 100644 --- a/core/include/Data/DataSeriesIterator.h +++ b/core/include/Data/DataSeriesIterator.h @@ -24,7 +24,7 @@ public: virtual bool equals(const Impl &other) const = 0; virtual bool lowerThan(const Impl &other) const = 0; virtual std::unique_ptr advance(int offset) const = 0; - virtual void next() = 0; + virtual void next(int offset) = 0; virtual void prev() = 0; virtual double x() const = 0; virtual double value() const = 0; @@ -46,7 +46,7 @@ public: DataSeriesIteratorValue advance(int offset) const; /// Advances to the next value - void next(); + void next(int offset = 1); /// Moves back to the previous value void prev(); /// Gets x-axis data diff --git a/core/include/Data/SqpIterator.h b/core/include/Data/SqpIterator.h index dcb0203..aae9315 100644 --- a/core/include/Data/SqpIterator.h +++ b/core/include/Data/SqpIterator.h @@ -52,9 +52,7 @@ public: SqpIterator &operator+=(int offset) { if (offset >= 0) { - while (offset--) { - m_CurrentValue.next(); - } + m_CurrentValue.next(offset); } else { while (offset++) { diff --git a/core/src/Data/ArrayDataIterator.cpp b/core/src/Data/ArrayDataIterator.cpp index 77734f2..70b47c2 100644 --- a/core/src/Data/ArrayDataIterator.cpp +++ b/core/src/Data/ArrayDataIterator.cpp @@ -36,9 +36,9 @@ ArrayDataIteratorValue ArrayDataIteratorValue::advance(int offset) const return ArrayDataIteratorValue{m_Impl->advance(offset)}; } -void ArrayDataIteratorValue::next() +void ArrayDataIteratorValue::next(int offset) { - m_Impl->next(); + m_Impl->next(offset); } void ArrayDataIteratorValue::prev() diff --git a/core/src/Data/DataSeriesIterator.cpp b/core/src/Data/DataSeriesIterator.cpp index 06a300b..a02ca2d 100644 --- a/core/src/Data/DataSeriesIterator.cpp +++ b/core/src/Data/DataSeriesIterator.cpp @@ -38,9 +38,9 @@ DataSeriesIteratorValue DataSeriesIteratorValue::advance(int offset) const return DataSeriesIteratorValue{m_Impl->advance(offset)}; } -void DataSeriesIteratorValue::next() +void DataSeriesIteratorValue::next(int offset) { - m_Impl->next(); + m_Impl->next(offset); } void DataSeriesIteratorValue::prev()