diff --git a/core/include/Data/ArrayData.h b/core/include/Data/ArrayData.h index 9cbcb50..462b2d4 100644 --- a/core/include/Data/ArrayData.h +++ b/core/include/Data/ArrayData.h @@ -9,6 +9,42 @@ #include +template +class ArrayData; + +using DataContainer = QVector >; + +namespace arraydata_detail { + +/// Struct used to sort ArrayData +template +struct Sort { + static std::shared_ptr > sort(const DataContainer &data, + const std::vector &sortPermutation) + { + auto nbComponents = data.size(); + auto sortedData = DataContainer(nbComponents); + + for (auto i = 0; i < nbComponents; ++i) { + sortedData[i] = SortUtils::sort(data.at(i), sortPermutation); + } + + return std::make_shared >(std::move(sortedData)); + } +}; + +/// Specialization for uni-dimensional ArrayData +template <> +struct Sort<1> { + static std::shared_ptr > sort(const DataContainer &data, + const std::vector &sortPermutation) + { + return std::make_shared >(SortUtils::sort(data.at(0), sortPermutation)); + } +}; + +} // namespace arraydata_detail + /** * @brief The ArrayData class represents a dataset for a data series. * @@ -40,7 +76,7 @@ public: * @remarks if the number of values is not the same for each component, no value is set */ template > - explicit ArrayData(QVector > data) + explicit ArrayData(DataContainer data) { auto nbComponents = data.size(); if (nbComponents < 2) { @@ -57,7 +93,7 @@ public: m_Data = std::move(data); } else { - m_Data = QVector >{nbComponents, QVector{}}; + m_Data = DataContainer{nbComponents, QVector{}}; } } @@ -141,11 +177,10 @@ public: return m_Data[0].size(); } - template > std::shared_ptr > sort(const std::vector &sortPermutation) { QReadLocker locker{&m_Lock}; - return std::make_shared >(SortUtils::sort(m_Data.at(0), sortPermutation)); + return arraydata_detail::Sort::sort(m_Data, sortPermutation); } void clear() @@ -159,7 +194,7 @@ public: } private: - QVector > m_Data; + DataContainer m_Data; mutable QReadWriteLock m_Lock; };