##// END OF EJS Templates
Adapts SqpIterator to make non-const iterators
Alexandre Leroux -
r673:09db2d1144f0
parent child
Show More
@@ -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::const_iterator m_It;
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{ArrayDataIteratorValue{
272 return ArrayDataIterator{
229 std::make_unique<arraydata_detail::IteratorValue<Dim> >(m_Data, m_NbComponents, true)}};
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 pointer operator->() const { return &m_CurrentValue; }
41 const T *operator->() const { return &m_CurrentValue; }
42 reference 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 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