@@ -0,0 +1,56 | |||||
|
1 | #ifndef SCIQLOP_ARRAYDATAITERATOR_H | |||
|
2 | #define SCIQLOP_ARRAYDATAITERATOR_H | |||
|
3 | ||||
|
4 | #include "CoreGlobal.h" | |||
|
5 | #include "Data/SqpIterator.h" | |||
|
6 | ||||
|
7 | #include <memory> | |||
|
8 | ||||
|
9 | /** | |||
|
10 | * @brief The ArrayDataIteratorValue class represents the current value of an array data iterator. | |||
|
11 | * It offers standard access methods for the data in the series (at(), first()), but it is up to | |||
|
12 | * each array data to define its own implementation of how to retrieve this data (one-dim or two-dim | |||
|
13 | * array), by implementing the ArrayDataIteratorValue::Impl interface | |||
|
14 | * @sa ArrayDataIterator | |||
|
15 | */ | |||
|
16 | class SCIQLOP_CORE_EXPORT ArrayDataIteratorValue { | |||
|
17 | public: | |||
|
18 | struct Impl { | |||
|
19 | virtual ~Impl() noexcept = default; | |||
|
20 | virtual std::unique_ptr<Impl> clone() const = 0; | |||
|
21 | virtual bool equals(const Impl &other) const = 0; | |||
|
22 | virtual void next() = 0; | |||
|
23 | virtual void prev() = 0; | |||
|
24 | virtual double at(int componentIndex) const = 0; | |||
|
25 | virtual double first() const = 0; | |||
|
26 | virtual double min() const = 0; | |||
|
27 | virtual double max() const = 0; | |||
|
28 | }; | |||
|
29 | ||||
|
30 | explicit ArrayDataIteratorValue(std::unique_ptr<Impl> impl); | |||
|
31 | ArrayDataIteratorValue(const ArrayDataIteratorValue &other); | |||
|
32 | ArrayDataIteratorValue(ArrayDataIteratorValue &&other) = default; | |||
|
33 | ArrayDataIteratorValue &operator=(ArrayDataIteratorValue other); | |||
|
34 | ||||
|
35 | bool equals(const ArrayDataIteratorValue &other) const; | |||
|
36 | ||||
|
37 | /// Advances to the next value | |||
|
38 | void next(); | |||
|
39 | /// Moves back to the previous value | |||
|
40 | void prev(); | |||
|
41 | /// Gets value of a specified component | |||
|
42 | double at(int componentIndex) const; | |||
|
43 | /// Gets value of first component | |||
|
44 | double first() const; | |||
|
45 | /// Gets min value among all components | |||
|
46 | double min() const; | |||
|
47 | /// Gets max value among all components | |||
|
48 | double max() const; | |||
|
49 | ||||
|
50 | private: | |||
|
51 | std::unique_ptr<Impl> m_Impl; | |||
|
52 | }; | |||
|
53 | ||||
|
54 | using ArrayDataIterator = SqpIterator<ArrayDataIteratorValue>; | |||
|
55 | ||||
|
56 | #endif // SCIQLOP_ARRAYDATAITERATOR_H |
@@ -0,0 +1,52 | |||||
|
1 | #include "Data/ArrayDataIterator.h" | |||
|
2 | ||||
|
3 | ArrayDataIteratorValue::ArrayDataIteratorValue(std::unique_ptr<ArrayDataIteratorValue::Impl> impl) | |||
|
4 | : m_Impl{std::move(impl)} | |||
|
5 | { | |||
|
6 | } | |||
|
7 | ||||
|
8 | ArrayDataIteratorValue::ArrayDataIteratorValue(const ArrayDataIteratorValue &other) | |||
|
9 | : m_Impl{other.m_Impl->clone()} | |||
|
10 | { | |||
|
11 | } | |||
|
12 | ||||
|
13 | ArrayDataIteratorValue &ArrayDataIteratorValue::operator=(ArrayDataIteratorValue other) | |||
|
14 | { | |||
|
15 | std::swap(m_Impl, other.m_Impl); | |||
|
16 | return *this; | |||
|
17 | } | |||
|
18 | ||||
|
19 | bool ArrayDataIteratorValue::equals(const ArrayDataIteratorValue &other) const | |||
|
20 | { | |||
|
21 | return m_Impl->equals(*other.m_Impl); | |||
|
22 | } | |||
|
23 | ||||
|
24 | void ArrayDataIteratorValue::next() | |||
|
25 | { | |||
|
26 | m_Impl->next(); | |||
|
27 | } | |||
|
28 | ||||
|
29 | void ArrayDataIteratorValue::prev() | |||
|
30 | { | |||
|
31 | m_Impl->prev(); | |||
|
32 | } | |||
|
33 | ||||
|
34 | double ArrayDataIteratorValue::at(int componentIndex) const | |||
|
35 | { | |||
|
36 | return m_Impl->at(componentIndex); | |||
|
37 | } | |||
|
38 | ||||
|
39 | double ArrayDataIteratorValue::first() const | |||
|
40 | { | |||
|
41 | return m_Impl->first(); | |||
|
42 | } | |||
|
43 | ||||
|
44 | double ArrayDataIteratorValue::min() const | |||
|
45 | { | |||
|
46 | return m_Impl->min(); | |||
|
47 | } | |||
|
48 | ||||
|
49 | double ArrayDataIteratorValue::max() const | |||
|
50 | { | |||
|
51 | return m_Impl->max(); | |||
|
52 | } |
General Comments 0
You need to be logged in to leave comments.
Login now