You can resize result to m_NbCompoenent then use [i] = instead of push_back
@@ -42,11 +42,9 struct Sort<1> { | |||
|
42 | 42 | template <int Dim> |
|
43 | 43 | class IteratorValue : public ArrayDataIteratorValue::Impl { |
|
44 | 44 | public: |
|
45 |
explicit IteratorValue(const DataContainer &container, bool begin) |
|
|
45 | explicit IteratorValue(const DataContainer &container, int nbComponents, bool begin) | |
|
46 | : m_It{begin ? container.cbegin() : container.cend()}, m_NbComponents{nbComponents} | |
|
46 | 47 | { |
|
47 | for (auto i = 0; i < container.size(); ++i) { | |
|
48 | m_Its.push_back(begin ? container.at(i).cbegin() : container.at(i).cend()); | |
|
49 | } | |
|
50 | 48 | } |
|
51 | 49 | |
|
52 | 50 | IteratorValue(const IteratorValue &other) = default; |
@@ -58,47 +56,50 public: | |||
|
58 | 56 | |
|
59 | 57 | bool equals(const ArrayDataIteratorValue::Impl &other) const override try { |
|
60 | 58 | const auto &otherImpl = dynamic_cast<const IteratorValue &>(other); |
|
61 | return m_Its == otherImpl.m_Its; | |
|
59 | return std::tie(m_It, m_NbComponents) == std::tie(otherImpl.m_It, otherImpl.m_NbComponents); | |
|
62 | 60 | } |
|
63 | 61 | catch (const std::bad_cast &) { |
|
64 | 62 | return false; |
|
65 | 63 | } |
|
66 | 64 | |
|
67 | void next() override | |
|
68 | { | |
|
69 | for (auto &it : m_Its) { | |
|
70 | ++it; | |
|
71 | } | |
|
72 | } | |
|
73 | ||
|
74 | void prev() override | |
|
75 | { | |
|
76 | for (auto &it : m_Its) { | |
|
77 | --it; | |
|
78 | } | |
|
79 | } | |
|
65 | void next() override { std::advance(m_It, m_NbComponents); } | |
|
66 | void prev() override { std::advance(m_It, -m_NbComponents); } | |
|
80 | 67 | |
|
81 |
double at(int componentIndex) const override { return * |
|
|
82 |
double first() const override { return *m_It |
|
|
68 | double at(int componentIndex) const override { return *(m_It + componentIndex); } | |
|
69 | double first() const override { return *m_It; } | |
|
83 | 70 | double min() const override |
|
84 | 71 | { |
|
85 |
auto |
|
|
86 | auto it = std::min_element(m_Its.cbegin(), end, [](const auto &it1, const auto &it2) { | |
|
87 | return SortUtils::minCompareWithNaN(*it1, *it2); | |
|
72 | auto values = this->values(); | |
|
73 | auto end = values.cend(); | |
|
74 | auto it = std::min_element(values.cbegin(), end, [](const auto &v1, const auto &v2) { | |
|
75 | return SortUtils::minCompareWithNaN(v1, v2); | |
|
88 | 76 | }); |
|
89 | return it != end ? **it : std::numeric_limits<double>::quiet_NaN(); | |
|
77 | ||
|
78 | return it != end ? *it : std::numeric_limits<double>::quiet_NaN(); | |
|
90 | 79 | } |
|
91 | 80 | double max() const override |
|
92 | 81 | { |
|
93 |
auto |
|
|
94 | auto it = std::max_element(m_Its.cbegin(), end, [](const auto &it1, const auto &it2) { | |
|
95 | return SortUtils::maxCompareWithNaN(*it1, *it2); | |
|
82 | auto values = this->values(); | |
|
83 | auto end = values.cend(); | |
|
84 | auto it = std::max_element(values.cbegin(), end, [](const auto &v1, const auto &v2) { | |
|
85 | return SortUtils::maxCompareWithNaN(v1, v2); | |
|
96 | 86 | }); |
|
97 |
return it != end ? |
|
|
87 | return it != end ? *it : std::numeric_limits<double>::quiet_NaN(); | |
|
98 | 88 | } |
|
99 | 89 | |
|
100 | 90 | private: |
|
101 | std::vector<DataContainer::value_type::const_iterator> m_Its; | |
|
91 | std::vector<double> values() const | |
|
92 | { | |
|
93 | auto result = std::vector<double>{}; | |
|
94 |
for (auto i = 0; i < m_NbComponents; ++i) {
|
|
|
95 | result.push_back(*(m_It + i)); | |
|
96 | } | |
|
97 | ||
|
98 | return result; | |
|
99 | } | |
|
100 | ||
|
101 | DataContainer::const_iterator m_It; | |
|
102 | int m_NbComponents; | |
|
102 | 103 | }; |
|
103 | 104 | |
|
104 | 105 | } // namespace arraydata_detail |
@@ -225,12 +226,13 public: | |||
|
225 | 226 | ArrayDataIterator cbegin() const |
|
226 | 227 | { |
|
227 | 228 | return ArrayDataIterator{ArrayDataIteratorValue{ |
|
228 | std::make_unique<arraydata_detail::IteratorValue<Dim> >(m_Data, true)}}; | |
|
229 | std::make_unique<arraydata_detail::IteratorValue<Dim> >(m_Data, m_NbComponents, true)}}; | |
|
229 | 230 | } |
|
230 | 231 | ArrayDataIterator cend() const |
|
231 | 232 | { |
|
232 |
return ArrayDataIterator{ |
|
|
233 |
std::make_unique<arraydata_detail::IteratorValue<Dim> >( |
|
|
233 | return ArrayDataIterator{ | |
|
234 | ArrayDataIteratorValue{std::make_unique<arraydata_detail::IteratorValue<Dim> >( | |
|
235 | m_Data, m_NbComponents, false)}}; | |
|
234 | 236 | } |
|
235 | 237 | |
|
236 | 238 | // ///////////// // |
General Comments 0
You need to be logged in to leave comments.
Login now