@@ -39,19 +39,49 struct Sort<1> { | |||||
39 | } |
|
39 | } | |
40 | }; |
|
40 | }; | |
41 |
|
41 | |||
|
42 | template <int Dim, bool IsConst> | |||
|
43 | class IteratorValue; | |||
|
44 | ||||
|
45 | template <int Dim, bool IsConst> | |||
|
46 | struct IteratorValueBuilder { | |||
|
47 | }; | |||
|
48 | ||||
|
49 | template <int Dim> | |||
|
50 | struct IteratorValueBuilder<Dim, true> { | |||
|
51 | using DataContainerIterator = DataContainer::const_iterator; | |||
|
52 | }; | |||
|
53 | ||||
42 | template <int Dim> |
|
54 | template <int Dim> | |
|
55 | struct IteratorValueBuilder<Dim, false> { | |||
|
56 | using DataContainerIterator = DataContainer::iterator; | |||
|
57 | }; | |||
|
58 | ||||
|
59 | template <int Dim, bool IsConst> | |||
43 | class IteratorValue : public ArrayDataIteratorValue::Impl { |
|
60 | class IteratorValue : public ArrayDataIteratorValue::Impl { | |
44 | public: |
|
61 | public: | |
|
62 | friend class ArrayData<Dim>; | |||
|
63 | friend class IteratorValueBuilder<Dim, IsConst>; | |||
|
64 | ||||
|
65 | using DataContainerIterator = | |||
|
66 | typename IteratorValueBuilder<Dim, IsConst>::DataContainerIterator; | |||
|
67 | ||||
|
68 | template <bool IC = IsConst, typename = std::enable_if_t<IC == true> > | |||
45 | explicit IteratorValue(const DataContainer &container, int nbComponents, bool begin) |
|
69 | explicit IteratorValue(const DataContainer &container, int nbComponents, bool begin) | |
46 | : m_It{begin ? container.cbegin() : container.cend()}, m_NbComponents{nbComponents} |
|
70 | : m_It{begin ? container.cbegin() : container.cend()}, m_NbComponents{nbComponents} | |
47 | { |
|
71 | { | |
48 | } |
|
72 | } | |
49 |
|
73 | |||
|
74 | template <bool IC = IsConst, typename = std::enable_if_t<IC == false> > | |||
|
75 | explicit IteratorValue(DataContainer &container, int nbComponents, bool begin) | |||
|
76 | : m_It{begin ? container.begin() : container.end()}, m_NbComponents{nbComponents} | |||
|
77 | { | |||
|
78 | } | |||
|
79 | ||||
50 | IteratorValue(const IteratorValue &other) = default; |
|
80 | IteratorValue(const IteratorValue &other) = default; | |
51 |
|
81 | |||
52 | std::unique_ptr<ArrayDataIteratorValue::Impl> clone() const override |
|
82 | std::unique_ptr<ArrayDataIteratorValue::Impl> clone() const override | |
53 | { |
|
83 | { | |
54 | return std::make_unique<IteratorValue<Dim> >(*this); |
|
84 | return std::make_unique<IteratorValue<Dim, IsConst> >(*this); | |
55 | } |
|
85 | } | |
56 |
|
86 | |||
57 | bool equals(const ArrayDataIteratorValue::Impl &other) const override try { |
|
87 | bool equals(const ArrayDataIteratorValue::Impl &other) const override try { | |
@@ -98,7 +128,7 public: | |||||
98 | } |
|
128 | } | |
99 |
|
129 | |||
100 | private: |
|
130 | private: | |
101 |
DataContainer |
|
131 | DataContainerIterator m_It; | |
102 | int m_NbComponents; |
|
132 | int m_NbComponents; | |
103 | }; |
|
133 | }; | |
104 |
|
134 | |||
@@ -223,15 +253,31 public: | |||||
223 | // Iterators // |
|
253 | // Iterators // | |
224 | // ///////// // |
|
254 | // ///////// // | |
225 |
|
255 | |||
|
256 | ArrayDataIterator begin() | |||
|
257 | { | |||
|
258 | return ArrayDataIterator{ | |||
|
259 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim, false> >( | |||
|
260 | m_Data, m_NbComponents, true)}}; | |||
|
261 | } | |||
|
262 | ||||
|
263 | ArrayDataIterator end() | |||
|
264 | { | |||
|
265 | return ArrayDataIterator{ | |||
|
266 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim, false> >( | |||
|
267 | m_Data, m_NbComponents, false)}}; | |||
|
268 | } | |||
|
269 | ||||
226 | ArrayDataIterator cbegin() const |
|
270 | ArrayDataIterator cbegin() const | |
227 | { |
|
271 | { | |
228 |
return ArrayDataIterator{ |
|
272 | return ArrayDataIterator{ | |
229 |
std::make_unique<arraydata_detail::IteratorValue<Dim> >( |
|
273 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim, true> >( | |
|
274 | m_Data, m_NbComponents, true)}}; | |||
230 | } |
|
275 | } | |
|
276 | ||||
231 | ArrayDataIterator cend() const |
|
277 | ArrayDataIterator cend() const | |
232 | { |
|
278 | { | |
233 | return ArrayDataIterator{ |
|
279 | return ArrayDataIterator{ | |
234 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim> >( |
|
280 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim, true> >( | |
235 | m_Data, m_NbComponents, false)}}; |
|
281 | m_Data, m_NbComponents, false)}}; | |
236 | } |
|
282 | } | |
237 |
|
283 |
@@ -27,20 +27,31 class DataSeries; | |||||
27 |
|
27 | |||
28 | namespace dataseries_detail { |
|
28 | namespace dataseries_detail { | |
29 |
|
29 | |||
30 | template <int Dim> |
|
30 | template <int Dim, bool IsConst> | |
31 | class IteratorValue : public DataSeriesIteratorValue::Impl { |
|
31 | class IteratorValue : public DataSeriesIteratorValue::Impl { | |
32 | public: |
|
32 | public: | |
|
33 | friend class DataSeries<Dim>; | |||
|
34 | ||||
|
35 | template <bool IC = IsConst, typename = std::enable_if_t<IC == false> > | |||
|
36 | explicit IteratorValue(DataSeries<Dim> &dataSeries, bool begin) | |||
|
37 | : m_XIt(begin ? dataSeries.xAxisData()->begin() : dataSeries.xAxisData()->end()), | |||
|
38 | m_ValuesIt(begin ? dataSeries.valuesData()->begin() : dataSeries.valuesData()->end()) | |||
|
39 | { | |||
|
40 | } | |||
|
41 | ||||
|
42 | template <bool IC = IsConst, typename = std::enable_if_t<IC == true> > | |||
33 | explicit IteratorValue(const DataSeries<Dim> &dataSeries, bool begin) |
|
43 | explicit IteratorValue(const DataSeries<Dim> &dataSeries, bool begin) | |
34 | : m_XIt(begin ? dataSeries.xAxisData()->cbegin() : dataSeries.xAxisData()->cend()), |
|
44 | : m_XIt(begin ? dataSeries.xAxisData()->cbegin() : dataSeries.xAxisData()->cend()), | |
35 | m_ValuesIt(begin ? dataSeries.valuesData()->cbegin() |
|
45 | m_ValuesIt(begin ? dataSeries.valuesData()->cbegin() | |
36 | : dataSeries.valuesData()->cend()) |
|
46 | : dataSeries.valuesData()->cend()) | |
37 | { |
|
47 | { | |
38 | } |
|
48 | } | |
|
49 | ||||
39 | IteratorValue(const IteratorValue &other) = default; |
|
50 | IteratorValue(const IteratorValue &other) = default; | |
40 |
|
51 | |||
41 | std::unique_ptr<DataSeriesIteratorValue::Impl> clone() const override |
|
52 | std::unique_ptr<DataSeriesIteratorValue::Impl> clone() const override | |
42 | { |
|
53 | { | |
43 | return std::make_unique<IteratorValue<Dim> >(*this); |
|
54 | return std::make_unique<IteratorValue<Dim, IsConst> >(*this); | |
44 | } |
|
55 | } | |
45 |
|
56 | |||
46 | bool equals(const DataSeriesIteratorValue::Impl &other) const override try { |
|
57 | bool equals(const DataSeriesIteratorValue::Impl &other) const override try { | |
@@ -149,16 +160,28 public: | |||||
149 | // Iterators // |
|
160 | // Iterators // | |
150 | // ///////// // |
|
161 | // ///////// // | |
151 |
|
162 | |||
|
163 | DataSeriesIterator begin() override | |||
|
164 | { | |||
|
165 | return DataSeriesIterator{DataSeriesIteratorValue{ | |||
|
166 | std::make_unique<dataseries_detail::IteratorValue<Dim, false> >(*this, true)}}; | |||
|
167 | } | |||
|
168 | ||||
|
169 | DataSeriesIterator end() override | |||
|
170 | { | |||
|
171 | return DataSeriesIterator{DataSeriesIteratorValue{ | |||
|
172 | std::make_unique<dataseries_detail::IteratorValue<Dim, false> >(*this, false)}}; | |||
|
173 | } | |||
|
174 | ||||
152 | DataSeriesIterator cbegin() const override |
|
175 | DataSeriesIterator cbegin() const override | |
153 | { |
|
176 | { | |
154 | return DataSeriesIterator{DataSeriesIteratorValue{ |
|
177 | return DataSeriesIterator{DataSeriesIteratorValue{ | |
155 | std::make_unique<dataseries_detail::IteratorValue<Dim> >(*this, true)}}; |
|
178 | std::make_unique<dataseries_detail::IteratorValue<Dim, true> >(*this, true)}}; | |
156 | } |
|
179 | } | |
157 |
|
180 | |||
158 | DataSeriesIterator cend() const override |
|
181 | DataSeriesIterator cend() const override | |
159 | { |
|
182 | { | |
160 | return DataSeriesIterator{DataSeriesIteratorValue{ |
|
183 | return DataSeriesIterator{DataSeriesIteratorValue{ | |
161 | std::make_unique<dataseries_detail::IteratorValue<Dim> >(*this, false)}}; |
|
184 | std::make_unique<dataseries_detail::IteratorValue<Dim, true> >(*this, false)}}; | |
162 | } |
|
185 | } | |
163 |
|
186 | |||
164 | /// @sa IDataSeries::minXAxisData() |
|
187 | /// @sa IDataSeries::minXAxisData() |
@@ -69,6 +69,8 public: | |||||
69 |
|
69 | |||
70 | virtual DataSeriesIterator cbegin() const = 0; |
|
70 | virtual DataSeriesIterator cbegin() const = 0; | |
71 | virtual DataSeriesIterator cend() const = 0; |
|
71 | virtual DataSeriesIterator cend() const = 0; | |
|
72 | virtual DataSeriesIterator begin() = 0; | |||
|
73 | virtual DataSeriesIterator end() = 0; | |||
72 |
|
74 | |||
73 | /// @return the iterator to the first entry of the data series whose x-axis data is greater than |
|
75 | /// @return the iterator to the first entry of the data series whose x-axis data is greater than | |
74 | /// or equal to the value passed in parameter, or the end iterator if there is no matching value |
|
76 | /// or equal to the value passed in parameter, or the end iterator if there is no matching value |
@@ -38,8 +38,10 public: | |||||
38 | return *this; |
|
38 | return *this; | |
39 | } |
|
39 | } | |
40 |
|
40 | |||
41 |
|
|
41 | const T *operator->() const { return &m_CurrentValue; } | |
42 |
|
|
42 | const T &operator*() const { return m_CurrentValue; } | |
|
43 | T *operator->() { return &m_CurrentValue; } | |||
|
44 | T &operator*() { return m_CurrentValue; } | |||
43 |
|
45 | |||
44 | bool operator==(const SqpIterator &other) const |
|
46 | bool operator==(const SqpIterator &other) const | |
45 | { |
|
47 | { |
General Comments 0
You need to be logged in to leave comments.
Login now