@@ -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 | 54 | template <int Dim> |
|
55 | struct IteratorValueBuilder<Dim, false> { | |
|
56 | using DataContainerIterator = DataContainer::iterator; | |
|
57 | }; | |
|
58 | ||
|
59 | template <int Dim, bool IsConst> | |
|
43 | 60 | class IteratorValue : public ArrayDataIteratorValue::Impl { |
|
44 | 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 | 69 | explicit IteratorValue(const DataContainer &container, int nbComponents, bool begin) |
|
46 | 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 | 80 | IteratorValue(const IteratorValue &other) = default; |
|
51 | 81 | |
|
52 | 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 | 87 | bool equals(const ArrayDataIteratorValue::Impl &other) const override try { |
@@ -98,7 +128,7 public: | |||
|
98 | 128 | } |
|
99 | 129 | |
|
100 | 130 | private: |
|
101 |
DataContainer |
|
|
131 | DataContainerIterator m_It; | |
|
102 | 132 | int m_NbComponents; |
|
103 | 133 | }; |
|
104 | 134 | |
@@ -223,15 +253,31 public: | |||
|
223 | 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 | 270 | ArrayDataIterator cbegin() const |
|
227 | 271 | { |
|
228 |
return ArrayDataIterator{ |
|
|
229 |
std::make_unique<arraydata_detail::IteratorValue<Dim> >( |
|
|
272 | return ArrayDataIterator{ | |
|
273 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim, true> >( | |
|
274 | m_Data, m_NbComponents, true)}}; | |
|
230 | 275 | } |
|
276 | ||
|
231 | 277 | ArrayDataIterator cend() const |
|
232 | 278 | { |
|
233 | 279 | return ArrayDataIterator{ |
|
234 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim> >( | |
|
280 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim, true> >( | |
|
235 | 281 | m_Data, m_NbComponents, false)}}; |
|
236 | 282 | } |
|
237 | 283 |
@@ -27,20 +27,31 class DataSeries; | |||
|
27 | 27 | |
|
28 | 28 | namespace dataseries_detail { |
|
29 | 29 | |
|
30 | template <int Dim> | |
|
30 | template <int Dim, bool IsConst> | |
|
31 | 31 | class IteratorValue : public DataSeriesIteratorValue::Impl { |
|
32 | 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 | 43 | explicit IteratorValue(const DataSeries<Dim> &dataSeries, bool begin) |
|
34 | 44 | : m_XIt(begin ? dataSeries.xAxisData()->cbegin() : dataSeries.xAxisData()->cend()), |
|
35 | 45 | m_ValuesIt(begin ? dataSeries.valuesData()->cbegin() |
|
36 | 46 | : dataSeries.valuesData()->cend()) |
|
37 | 47 | { |
|
38 | 48 | } |
|
49 | ||
|
39 | 50 | IteratorValue(const IteratorValue &other) = default; |
|
40 | 51 | |
|
41 | 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 | 57 | bool equals(const DataSeriesIteratorValue::Impl &other) const override try { |
@@ -149,16 +160,28 public: | |||
|
149 | 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 | 175 | DataSeriesIterator cbegin() const override |
|
153 | 176 | { |
|
154 | 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 | 181 | DataSeriesIterator cend() const override |
|
159 | 182 | { |
|
160 | 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 | 187 | /// @sa IDataSeries::minXAxisData() |
@@ -69,6 +69,8 public: | |||
|
69 | 69 | |
|
70 | 70 | virtual DataSeriesIterator cbegin() const = 0; |
|
71 | 71 | virtual DataSeriesIterator cend() const = 0; |
|
72 | virtual DataSeriesIterator begin() = 0; | |
|
73 | virtual DataSeriesIterator end() = 0; | |
|
72 | 74 | |
|
73 | 75 | /// @return the iterator to the first entry of the data series whose x-axis data is greater than |
|
74 | 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 | 38 | return *this; |
|
39 | 39 | } |
|
40 | 40 | |
|
41 |
|
|
|
42 |
|
|
|
41 | const T *operator->() const { return &m_CurrentValue; } | |
|
42 | const T &operator*() const { return m_CurrentValue; } | |
|
43 | T *operator->() { return &m_CurrentValue; } | |
|
44 | T &operator*() { return m_CurrentValue; } | |
|
43 | 45 | |
|
44 | 46 | bool operator==(const SqpIterator &other) const |
|
45 | 47 | { |
General Comments 0
You need to be logged in to leave comments.
Login now