@@ -34,6 +34,31 struct SortUtils { | |||
|
34 | 34 | [&](int i, int j) { return compare(container.at(i), container.at(j)); }); |
|
35 | 35 | return permutation; |
|
36 | 36 | } |
|
37 | ||
|
38 | /** | |
|
39 | * Sorts a container according to indices passed in parameter | |
|
40 | * @param container the container sorted | |
|
41 | * @param sortPermutation the indices used to sort the container | |
|
42 | * @return the container sorted | |
|
43 | * @warning no verification is made on validity of sortPermutation (i.e. the vector has unique | |
|
44 | * indices and its range is [0 ; vector.size()[ ) | |
|
45 | */ | |
|
46 | template <typename Container> | |
|
47 | static Container sort(const Container &container, const std::vector<int> &sortPermutation) | |
|
48 | { | |
|
49 | if (container.size() != sortPermutation.size()) { | |
|
50 | return Container{}; | |
|
51 | } | |
|
52 | ||
|
53 | // Inits result | |
|
54 | auto sortedData = Container{}; | |
|
55 | sortedData.resize(container.size()); | |
|
56 | ||
|
57 | std::transform(sortPermutation.cbegin(), sortPermutation.cend(), sortedData.begin(), | |
|
58 | [&container](int i) { return container.at(i); }); | |
|
59 | ||
|
60 | return sortedData; | |
|
61 | } | |
|
37 | 62 | }; |
|
38 | 63 | |
|
39 | 64 | #endif // SCIQLOP_SORTUTILS_H |
@@ -1,6 +1,8 | |||
|
1 | 1 | #ifndef SCIQLOP_ARRAYDATA_H |
|
2 | 2 | #define SCIQLOP_ARRAYDATA_H |
|
3 | 3 | |
|
4 | #include <Common/SortUtils.h> | |
|
5 | ||
|
4 | 6 | #include <QReadLocker> |
|
5 | 7 | #include <QReadWriteLock> |
|
6 | 8 | #include <QVector> |
@@ -140,20 +142,10 public: | |||
|
140 | 142 | } |
|
141 | 143 | |
|
142 | 144 | template <int D = Dim, typename = std::enable_if_t<D == 1> > |
|
143 | std::shared_ptr<ArrayData<Dim> > sort(const std::vector<int> sortPermutation) | |
|
145 | std::shared_ptr<ArrayData<Dim> > sort(const std::vector<int> &sortPermutation) | |
|
144 | 146 | { |
|
145 | 147 | QReadLocker locker{&m_Lock}; |
|
146 | ||
|
147 | const auto &data = m_Data.at(0); | |
|
148 | ||
|
149 | // Inits result | |
|
150 | auto sortedData = QVector<double>{}; | |
|
151 | sortedData.resize(data.size()); | |
|
152 | ||
|
153 | std::transform(sortPermutation.cbegin(), sortPermutation.cend(), sortedData.begin(), | |
|
154 | [&data](int i) { return data[i]; }); | |
|
155 | ||
|
156 | return std::make_shared<ArrayData<Dim> >(std::move(sortedData)); | |
|
148 | return std::make_shared<ArrayData<Dim> >(SortUtils::sort(m_Data.at(0), sortPermutation)); | |
|
157 | 149 | } |
|
158 | 150 | |
|
159 | 151 | void clear() |
General Comments 0
You need to be logged in to leave comments.
Login now