From df3e79308ca87b75b15581dc75f640ab95ff1c74 2017-08-17 08:24:19 From: Alexandre Leroux Date: 2017-08-17 08:24:19 Subject: [PATCH] Creates vector series + updates ScalarSeries::subDataSeries() to use iterators --- diff --git a/core/include/Data/VectorSeries.h b/core/include/Data/VectorSeries.h new file mode 100644 index 0000000..634039c --- /dev/null +++ b/core/include/Data/VectorSeries.h @@ -0,0 +1,30 @@ +#ifndef SCIQLOP_VECTORSERIES_H +#define SCIQLOP_VECTORSERIES_H + +#include "CoreGlobal.h" + +#include + +/** + * @brief The VectorSeries class is the implementation for a data series representing a vector. + */ +class SCIQLOP_CORE_EXPORT VectorSeries : public DataSeries<2> { +public: + /** + * Ctor. The vectors must have the same size, otherwise a ScalarSeries with no values will be + * created. + * @param xAxisData x-axis data + * @param xvaluesData x-values data + * @param yvaluesData y-values data + * @param zvaluesData z-values data + */ + explicit VectorSeries(QVector xAxisData, QVector xValuesData, + QVector yValuesData, QVector zValuesData, + const Unit &xAxisUnit, const Unit &valuesUnit); + + std::unique_ptr clone() const; + + std::shared_ptr subDataSeries(const SqpRange &range) override; +}; + +#endif // SCIQLOP_VECTORSERIES_H diff --git a/core/src/Data/ScalarSeries.cpp b/core/src/Data/ScalarSeries.cpp index 94387da..7b5b64a 100644 --- a/core/src/Data/ScalarSeries.cpp +++ b/core/src/Data/ScalarSeries.cpp @@ -18,20 +18,10 @@ std::shared_ptr ScalarSeries::subDataSeries(const SqpRange &range) auto subValuesData = QVector(); this->lockRead(); { - const auto ¤tXData = this->xAxisData()->cdata(); - const auto ¤tValuesData = this->valuesData()->cdata(); - - auto xDataBegin = currentXData.cbegin(); - auto xDataEnd = currentXData.cend(); - - auto lowerIt = std::lower_bound(xDataBegin, xDataEnd, range.m_TStart); - auto upperIt = std::upper_bound(xDataBegin, xDataEnd, range.m_TEnd); - auto distance = std::distance(xDataBegin, lowerIt); - - auto valuesDataIt = currentValuesData.cbegin() + distance; - for (auto xAxisDataIt = lowerIt; xAxisDataIt != upperIt; ++xAxisDataIt, ++valuesDataIt) { - subXAxisData.append(*xAxisDataIt); - subValuesData.append(*valuesDataIt); + auto bounds = subData(range.m_TStart, range.m_TEnd); + for (auto it = bounds.first; it != bounds.second; ++it) { + subXAxisData.append(it->x()); + subValuesData.append(it->value()); } } this->unlock(); diff --git a/core/src/Data/VectorSeries.cpp b/core/src/Data/VectorSeries.cpp new file mode 100644 index 0000000..06432e5 --- /dev/null +++ b/core/src/Data/VectorSeries.cpp @@ -0,0 +1,39 @@ +#include "Data/VectorSeries.h" + +VectorSeries::VectorSeries(QVector xAxisData, QVector xValuesData, + QVector yValuesData, QVector zValuesData, + const Unit &xAxisUnit, const Unit &valuesUnit) + : DataSeries{std::make_shared >(std::move(xAxisData)), xAxisUnit, + std::make_shared >(QVector >{ + std::move(xValuesData), std::move(yValuesData), std::move(zValuesData)}), + valuesUnit} +{ +} + +std::unique_ptr VectorSeries::clone() const +{ + return std::make_unique(*this); +} + +std::shared_ptr VectorSeries::subDataSeries(const SqpRange &range) +{ + auto subXAxisData = QVector(); + auto subXValuesData = QVector(); + auto subYValuesData = QVector(); + auto subZValuesData = QVector(); + + this->lockRead(); + { + auto bounds = subData(range.m_TStart, range.m_TEnd); + for (auto it = bounds.first; it != bounds.second; ++it) { + subXAxisData.append(it->x()); + subXValuesData.append(it->value(0)); + subYValuesData.append(it->value(1)); + subZValuesData.append(it->value(2)); + } + } + this->unlock(); + + return std::make_shared(subXAxisData, subXValuesData, subYValuesData, + subZValuesData, this->xAxisUnit(), this->valuesUnit()); +}