@@ -58,6 +58,67 struct Sort<1> { | |||||
58 | template <int Dim> |
|
58 | template <int Dim> | |
59 | class ArrayData { |
|
59 | class ArrayData { | |
60 | public: |
|
60 | public: | |
|
61 | class IteratorValue { | |||
|
62 | public: | |||
|
63 | explicit IteratorValue(const DataContainer &container, bool begin) : m_Its{} | |||
|
64 | { | |||
|
65 | for (auto i = 0; i < container.size(); ++i) { | |||
|
66 | m_Its.push_back(begin ? container.at(i).cbegin() : container.at(i).cend()); | |||
|
67 | } | |||
|
68 | } | |||
|
69 | ||||
|
70 | double at(int index) const { return *m_Its.at(index); } | |||
|
71 | double first() const { return *m_Its.front(); } | |||
|
72 | ||||
|
73 | void next() | |||
|
74 | { | |||
|
75 | for (auto &it : m_Its) { | |||
|
76 | ++it; | |||
|
77 | } | |||
|
78 | } | |||
|
79 | ||||
|
80 | bool operator==(const IteratorValue &other) const { return m_Its == other.m_Its; } | |||
|
81 | ||||
|
82 | private: | |||
|
83 | std::vector<DataContainer::value_type::const_iterator> m_Its; | |||
|
84 | }; | |||
|
85 | ||||
|
86 | class Iterator { | |||
|
87 | public: | |||
|
88 | using iterator_category = std::forward_iterator_tag; | |||
|
89 | using value_type = const IteratorValue; | |||
|
90 | using difference_type = std::ptrdiff_t; | |||
|
91 | using pointer = value_type *; | |||
|
92 | using reference = value_type &; | |||
|
93 | ||||
|
94 | Iterator(const DataContainer &container, bool begin) : m_CurrentValue{container, begin} {} | |||
|
95 | ||||
|
96 | virtual ~Iterator() noexcept = default; | |||
|
97 | Iterator(const Iterator &) = default; | |||
|
98 | Iterator(Iterator &&) = default; | |||
|
99 | Iterator &operator=(const Iterator &) = default; | |||
|
100 | Iterator &operator=(Iterator &&) = default; | |||
|
101 | ||||
|
102 | Iterator &operator++() | |||
|
103 | { | |||
|
104 | m_CurrentValue.next(); | |||
|
105 | return *this; | |||
|
106 | } | |||
|
107 | ||||
|
108 | pointer operator->() const { return &m_CurrentValue; } | |||
|
109 | reference operator*() const { return m_CurrentValue; } | |||
|
110 | ||||
|
111 | bool operator==(const Iterator &other) const | |||
|
112 | { | |||
|
113 | return m_CurrentValue == other.m_CurrentValue; | |||
|
114 | } | |||
|
115 | ||||
|
116 | bool operator!=(const Iterator &other) const { return !(*this == other); } | |||
|
117 | ||||
|
118 | private: | |||
|
119 | IteratorValue m_CurrentValue; | |||
|
120 | }; | |||
|
121 | ||||
61 | // ///// // |
|
122 | // ///// // | |
62 | // Ctors // |
|
123 | // Ctors // | |
63 | // ///// // |
|
124 | // ///// // | |
@@ -184,6 +245,13 public: | |||||
184 | return arraydata_detail::Sort<Dim>::sort(m_Data, sortPermutation); |
|
245 | return arraydata_detail::Sort<Dim>::sort(m_Data, sortPermutation); | |
185 | } |
|
246 | } | |
186 |
|
247 | |||
|
248 | // ///////// // | |||
|
249 | // Iterators // | |||
|
250 | // ///////// // | |||
|
251 | ||||
|
252 | Iterator cbegin() const { return Iterator{m_Data, true}; } | |||
|
253 | Iterator cend() const { return Iterator{m_Data, false}; } | |||
|
254 | ||||
187 | // ///////////// // |
|
255 | // ///////////// // | |
188 | // 1-dim methods // |
|
256 | // 1-dim methods // | |
189 | // ///////////// // |
|
257 | // ///////////// // |
@@ -29,6 +29,71 Q_LOGGING_CATEGORY(LOG_DataSeries, "DataSeries") | |||||
29 | template <int Dim> |
|
29 | template <int Dim> | |
30 | class DataSeries : public IDataSeries { |
|
30 | class DataSeries : public IDataSeries { | |
31 | public: |
|
31 | public: | |
|
32 | class IteratorValue { | |||
|
33 | public: | |||
|
34 | explicit IteratorValue(const DataSeries &dataSeries, bool begin) | |||
|
35 | : m_XIt(begin ? dataSeries.xAxisData()->cbegin() : dataSeries.xAxisData()->cend()), | |||
|
36 | m_ValuesIt(begin ? dataSeries.valuesData()->cbegin() | |||
|
37 | : dataSeries.valuesData()->cend()) | |||
|
38 | { | |||
|
39 | } | |||
|
40 | ||||
|
41 | double x() const { return m_XIt->at(0); } | |||
|
42 | double value() const { return m_ValuesIt->at(0); } | |||
|
43 | double value(int componentIndex) const { return m_ValuesIt->at(componentIndex); } | |||
|
44 | ||||
|
45 | void next() | |||
|
46 | { | |||
|
47 | ++m_XIt; | |||
|
48 | ++m_ValuesIt; | |||
|
49 | } | |||
|
50 | ||||
|
51 | bool operator==(const IteratorValue &other) const | |||
|
52 | { | |||
|
53 | return std::tie(m_XIt, m_ValuesIt) == std::tie(other.m_XIt, other.m_ValuesIt); | |||
|
54 | } | |||
|
55 | ||||
|
56 | private: | |||
|
57 | ArrayData<1>::Iterator m_XIt; | |||
|
58 | typename ArrayData<Dim>::Iterator m_ValuesIt; | |||
|
59 | }; | |||
|
60 | ||||
|
61 | class Iterator { | |||
|
62 | public: | |||
|
63 | using iterator_category = std::forward_iterator_tag; | |||
|
64 | using value_type = const IteratorValue; | |||
|
65 | using difference_type = std::ptrdiff_t; | |||
|
66 | using pointer = value_type *; | |||
|
67 | using reference = value_type &; | |||
|
68 | ||||
|
69 | Iterator(const DataSeries &dataSeries, bool begin) : m_CurrentValue{dataSeries, begin} {} | |||
|
70 | virtual ~Iterator() noexcept = default; | |||
|
71 | Iterator(const Iterator &) = default; | |||
|
72 | Iterator(Iterator &&) = default; | |||
|
73 | Iterator &operator=(const Iterator &) = default; | |||
|
74 | Iterator &operator=(Iterator &&) = default; | |||
|
75 | ||||
|
76 | Iterator &operator++() | |||
|
77 | { | |||
|
78 | m_CurrentValue.next(); | |||
|
79 | return *this; | |||
|
80 | } | |||
|
81 | ||||
|
82 | pointer operator->() const { return &m_CurrentValue; } | |||
|
83 | ||||
|
84 | reference operator*() const { return m_CurrentValue; } | |||
|
85 | ||||
|
86 | bool operator==(const Iterator &other) const | |||
|
87 | { | |||
|
88 | return m_CurrentValue == other.m_CurrentValue; | |||
|
89 | } | |||
|
90 | ||||
|
91 | bool operator!=(const Iterator &other) const { return !(*this == other); } | |||
|
92 | ||||
|
93 | private: | |||
|
94 | IteratorValue m_CurrentValue; | |||
|
95 | }; | |||
|
96 | ||||
32 | /// @sa IDataSeries::xAxisData() |
|
97 | /// @sa IDataSeries::xAxisData() | |
33 | std::shared_ptr<ArrayData<1> > xAxisData() override { return m_XAxisData; } |
|
98 | std::shared_ptr<ArrayData<1> > xAxisData() override { return m_XAxisData; } | |
34 | const std::shared_ptr<ArrayData<1> > xAxisData() const { return m_XAxisData; } |
|
99 | const std::shared_ptr<ArrayData<1> > xAxisData() const { return m_XAxisData; } | |
@@ -119,6 +184,39 public: | |||||
119 | dataSeries->unlock(); |
|
184 | dataSeries->unlock(); | |
120 | } |
|
185 | } | |
121 |
|
186 | |||
|
187 | // ///////// // | |||
|
188 | // Iterators // | |||
|
189 | // ///////// // | |||
|
190 | ||||
|
191 | Iterator cbegin() const { return Iterator{*this, true}; } | |||
|
192 | ||||
|
193 | Iterator cend() const { return Iterator{*this, false}; } | |||
|
194 | ||||
|
195 | std::pair<Iterator, Iterator> subData(double min, double max) const | |||
|
196 | { | |||
|
197 | if (min > max) { | |||
|
198 | std::swap(min, max); | |||
|
199 | } | |||
|
200 | ||||
|
201 | auto begin = cbegin(); | |||
|
202 | auto end = cend(); | |||
|
203 | ||||
|
204 | auto lowerIt | |||
|
205 | = std::lower_bound(begin, end, min, [](const auto &itValue, const auto &value) { | |||
|
206 | return itValue.x() == value; | |||
|
207 | }); | |||
|
208 | auto upperIt | |||
|
209 | = std::upper_bound(begin, end, max, [](const auto &value, const auto &itValue) { | |||
|
210 | return itValue.x() == value; | |||
|
211 | }); | |||
|
212 | ||||
|
213 | return std::make_pair(lowerIt, upperIt); | |||
|
214 | } | |||
|
215 | ||||
|
216 | // /////// // | |||
|
217 | // Mutexes // | |||
|
218 | // /////// // | |||
|
219 | ||||
122 | virtual void lockRead() { m_Lock.lockForRead(); } |
|
220 | virtual void lockRead() { m_Lock.lockForRead(); } | |
123 | virtual void lockWrite() { m_Lock.lockForWrite(); } |
|
221 | virtual void lockWrite() { m_Lock.lockForWrite(); } | |
124 | virtual void unlock() { m_Lock.unlock(); } |
|
222 | virtual void unlock() { m_Lock.unlock(); } |
@@ -56,7 +56,8 public: | |||||
56 | virtual Unit valuesUnit() const = 0; |
|
56 | virtual Unit valuesUnit() const = 0; | |
57 |
|
57 | |||
58 | virtual void merge(IDataSeries *dataSeries) = 0; |
|
58 | virtual void merge(IDataSeries *dataSeries) = 0; | |
59 | virtual std::shared_ptr<IDataSeries> subData(const SqpRange &range) = 0; |
|
59 | /// @todo Review the name and signature of this method | |
|
60 | virtual std::shared_ptr<IDataSeries> subDataSeries(const SqpRange &range) = 0; | |||
60 |
|
61 | |||
61 | virtual std::unique_ptr<IDataSeries> clone() const = 0; |
|
62 | virtual std::unique_ptr<IDataSeries> clone() const = 0; | |
62 | virtual SqpRange range() const = 0; |
|
63 | virtual SqpRange range() const = 0; |
@@ -21,7 +21,7 public: | |||||
21 |
|
21 | |||
22 | std::unique_ptr<IDataSeries> clone() const override; |
|
22 | std::unique_ptr<IDataSeries> clone() const override; | |
23 |
|
23 | |||
24 | std::shared_ptr<IDataSeries> subData(const SqpRange &range) override; |
|
24 | std::shared_ptr<IDataSeries> subDataSeries(const SqpRange &range) override; | |
25 | }; |
|
25 | }; | |
26 |
|
26 | |||
27 | #endif // SCIQLOP_SCALARSERIES_H |
|
27 | #endif // SCIQLOP_SCALARSERIES_H |
@@ -12,7 +12,7 std::unique_ptr<IDataSeries> ScalarSeries::clone() const | |||||
12 | return std::make_unique<ScalarSeries>(*this); |
|
12 | return std::make_unique<ScalarSeries>(*this); | |
13 | } |
|
13 | } | |
14 |
|
14 | |||
15 | std::shared_ptr<IDataSeries> ScalarSeries::subData(const SqpRange &range) |
|
15 | std::shared_ptr<IDataSeries> ScalarSeries::subDataSeries(const SqpRange &range) | |
16 | { |
|
16 | { | |
17 | auto subXAxisData = QVector<double>(); |
|
17 | auto subXAxisData = QVector<double>(); | |
18 | auto subValuesData = QVector<double>(); |
|
18 | auto subValuesData = QVector<double>(); |
@@ -107,7 +107,7 void Variable::mergeDataSeries(std::shared_ptr<IDataSeries> dataSeries) noexcept | |||||
107 | impl->unlock(); |
|
107 | impl->unlock(); | |
108 |
|
108 | |||
109 | // sub the data |
|
109 | // sub the data | |
110 | auto subData = this->dataSeries()->subData(this->cacheRange()); |
|
110 | auto subData = this->dataSeries()->subDataSeries(this->cacheRange()); | |
111 | qCDebug(LOG_Variable()) << "TORM: Variable::mergeDataSeries sub" << subData->range(); |
|
111 | qCDebug(LOG_Variable()) << "TORM: Variable::mergeDataSeries sub" << subData->range(); | |
112 | this->setDataSeries(subData); |
|
112 | this->setDataSeries(subData); | |
113 | qCDebug(LOG_Variable()) << "TORM: Variable::mergeDataSeries set" << this->dataSeries()->range(); |
|
113 | qCDebug(LOG_Variable()) << "TORM: Variable::mergeDataSeries set" << this->dataSeries()->range(); |
@@ -481,7 +481,7 void VariableController::VariableControllerPrivate::processRequest(std::shared_p | |||||
481 | else { |
|
481 | else { | |
482 | var->setRange(rangeRequested); |
|
482 | var->setRange(rangeRequested); | |
483 | var->setCacheRange(varRangesRequested.second); |
|
483 | var->setCacheRange(varRangesRequested.second); | |
484 | var->setDataSeries(var->dataSeries()->subData(varRangesRequested.second)); |
|
484 | var->setDataSeries(var->dataSeries()->subDataSeries(varRangesRequested.second)); | |
485 | emit var->updated(); |
|
485 | emit var->updated(); | |
486 | } |
|
486 | } | |
487 | } |
|
487 | } |
@@ -11,6 +11,32 ArrayData\.h:\d+:.*IPSIS_S06.*found: (D) | |||||
11 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (Dim) |
|
11 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (Dim) | |
12 | DataSeries\.h:\d+:.*IPSIS_S04_VARIABLE.* |
|
12 | DataSeries\.h:\d+:.*IPSIS_S04_VARIABLE.* | |
13 |
|
13 | |||
|
14 | # Ignore false positive relative to iterators | |||
|
15 | ArrayData\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (forward_iterator_tag) | |||
|
16 | ArrayData\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (IteratorValue) | |||
|
17 | ArrayData\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (ptrdiff_t) | |||
|
18 | ArrayData\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (value_type) | |||
|
19 | ArrayData\.h:\d+:.*IPSIS_S05.* | |||
|
20 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (iterator_category) | |||
|
21 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (forward_iterator_tag) | |||
|
22 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (value_type) | |||
|
23 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (IteratorValue) | |||
|
24 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (difference_type) | |||
|
25 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (ptrdiff_t) | |||
|
26 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (pointer) | |||
|
27 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (reference) | |||
|
28 | ArrayData\.h:\d+:.*IPSIS_S06.*found: (value_type) | |||
|
29 | DataSeries\.h:\d+:.*IPSIS_S05.* | |||
|
30 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (iterator_category) | |||
|
31 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (forward_iterator_tag) | |||
|
32 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (value_type) | |||
|
33 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (IteratorValue) | |||
|
34 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (difference_type) | |||
|
35 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (ptrdiff_t) | |||
|
36 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (pointer) | |||
|
37 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (reference) | |||
|
38 | DataSeries\.h:\d+:.*IPSIS_S06.*found: (value_type) | |||
|
39 | ||||
14 | # Ignore false positive relative to an alias |
|
40 | # Ignore false positive relative to an alias | |
15 | DataSourceItemAction\.h:\d+:.*IPSIS_S06.*found: (ExecuteFunction) |
|
41 | DataSourceItemAction\.h:\d+:.*IPSIS_S06.*found: (ExecuteFunction) | |
16 |
|
42 |
General Comments 0
You need to be logged in to leave comments.
Login now