diff --git a/core/include/Data/DataSeries.h b/core/include/Data/DataSeries.h index 46ee991..e94b9c4 100644 --- a/core/include/Data/DataSeries.h +++ b/core/include/Data/DataSeries.h @@ -26,12 +26,14 @@ class DataSeries : public IDataSeries { public: /// @sa IDataSeries::xAxisData() std::shared_ptr > xAxisData() override { return m_XAxisData; } + const std::shared_ptr > xAxisData() const { return m_XAxisData; } /// @sa IDataSeries::xAxisUnit() Unit xAxisUnit() const override { return m_XAxisUnit; } /// @return the values dataset - std::shared_ptr > valuesData() const { return m_ValuesData; } + std::shared_ptr > valuesData() { return m_ValuesData; } + const std::shared_ptr > valuesData() const { return m_ValuesData; } /// @sa IDataSeries::valuesUnit() Unit valuesUnit() const override { return m_ValuesUnit; } @@ -60,6 +62,27 @@ protected: { } + /// Copy ctor + explicit DataSeries(const DataSeries &other) + : m_XAxisData{std::make_shared >(*other.m_XAxisData)}, + m_XAxisUnit{other.m_XAxisUnit}, + m_ValuesData{std::make_shared >(*other.m_ValuesData)}, + m_ValuesUnit{other.m_ValuesUnit} + { + } + + /// Assignment operator + template + DataSeries &operator=(DataSeries other) + { + std::swap(m_XAxisData, other.m_XAxisData); + std::swap(m_XAxisUnit, other.m_XAxisUnit); + std::swap(m_ValuesData, other.m_ValuesData); + std::swap(m_ValuesUnit, other.m_ValuesUnit); + + return *this; + } + private: std::shared_ptr > m_XAxisData; Unit m_XAxisUnit; diff --git a/core/include/Data/IDataProvider.h b/core/include/Data/IDataProvider.h index 4eafa26..6f4b5b6 100644 --- a/core/include/Data/IDataProvider.h +++ b/core/include/Data/IDataProvider.h @@ -26,7 +26,7 @@ class IDataProvider : public QObject { public: virtual ~IDataProvider() noexcept = default; - virtual std::unique_ptr + virtual std::shared_ptr retrieveData(const DataProviderParameters ¶meters) const = 0; diff --git a/core/include/Data/IDataSeries.h b/core/include/Data/IDataSeries.h index 08336ec..af1b2b2 100644 --- a/core/include/Data/IDataSeries.h +++ b/core/include/Data/IDataSeries.h @@ -41,11 +41,16 @@ public: /// Returns the x-axis dataset virtual std::shared_ptr > xAxisData() = 0; + /// Returns the x-axis dataset (as const) + virtual const std::shared_ptr > xAxisData() const = 0; + virtual Unit xAxisUnit() const = 0; virtual Unit valuesUnit() const = 0; virtual void merge(IDataSeries *dataSeries) = 0; + + virtual std::unique_ptr clone() const = 0; }; // Required for using shared_ptr in signals/slots diff --git a/core/include/Data/ScalarSeries.h b/core/include/Data/ScalarSeries.h index 69d68e1..03d69cc 100644 --- a/core/include/Data/ScalarSeries.h +++ b/core/include/Data/ScalarSeries.h @@ -23,6 +23,8 @@ public: * @param value the value data */ void setData(int index, double x, double value) noexcept; + + std::unique_ptr clone() const; }; #endif // SCIQLOP_SCALARSERIES_H diff --git a/core/include/Variable/Variable.h b/core/include/Variable/Variable.h index a1f13f1..1bd730c 100644 --- a/core/include/Variable/Variable.h +++ b/core/include/Variable/Variable.h @@ -36,10 +36,9 @@ public: bool contains(const SqpDateTime &dateTime); bool intersect(const SqpDateTime &dateTime); - void setDataSeries(std::unique_ptr dataSeries) noexcept; public slots: - void onAddDataSeries(std::shared_ptr dataSeries) noexcept; + void setDataSeries(std::shared_ptr dataSeries) noexcept; signals: void updated(); diff --git a/core/include/Variable/VariableModel.h b/core/include/Variable/VariableModel.h index 07f60fc..02b204b 100644 --- a/core/include/Variable/VariableModel.h +++ b/core/include/Variable/VariableModel.h @@ -30,7 +30,7 @@ public: */ std::shared_ptr createVariable(const QString &name, const SqpDateTime &dateTime, - std::unique_ptr defaultDataSeries) noexcept; + std::shared_ptr defaultDataSeries) noexcept; std::shared_ptr variable(int index) const; diff --git a/core/src/Data/ScalarSeries.cpp b/core/src/Data/ScalarSeries.cpp index 90718a5..2673da9 100644 --- a/core/src/Data/ScalarSeries.cpp +++ b/core/src/Data/ScalarSeries.cpp @@ -11,3 +11,8 @@ void ScalarSeries::setData(int index, double x, double value) noexcept xAxisData()->setData(index, x); valuesData()->setData(index, value); } + +std::unique_ptr ScalarSeries::clone() const +{ + return std::make_unique(*this); +} diff --git a/core/src/Variable/Variable.cpp b/core/src/Variable/Variable.cpp index 899ca31..7f98687 100644 --- a/core/src/Variable/Variable.cpp +++ b/core/src/Variable/Variable.cpp @@ -55,16 +55,18 @@ void Variable::setDateTime(const SqpDateTime &dateTime) noexcept impl->m_DateTime = dateTime; } -void Variable::setDataSeries(std::unique_ptr dataSeries) noexcept +void Variable::setDataSeries(std::shared_ptr dataSeries) noexcept { - if (!impl->m_DataSeries) { - impl->m_DataSeries = std::move(dataSeries); + if (!dataSeries) { + /// @todo ALX : log + return; } -} -void Variable::onAddDataSeries(std::shared_ptr dataSeries) noexcept -{ - if (impl->m_DataSeries) { + // Inits the data series of the variable + if (!impl->m_DataSeries) { + impl->m_DataSeries = dataSeries->clone(); + } + else { impl->m_DataSeries->merge(dataSeries.get()); emit updated(); diff --git a/core/src/Variable/VariableController.cpp b/core/src/Variable/VariableController.cpp index 11e0b3b..41021cb 100644 --- a/core/src/Variable/VariableController.cpp +++ b/core/src/Variable/VariableController.cpp @@ -21,7 +21,7 @@ namespace { /// @todo Generates default dataseries, according to the provider passed in parameter. This method /// will be deleted when the timerange is recovered from SciQlop -std::unique_ptr generateDefaultDataSeries(const IDataProvider &provider, +std::shared_ptr generateDefaultDataSeries(const IDataProvider &provider, const SqpDateTime &dateTime) noexcept { auto parameters = DataProviderParameters{dateTime}; @@ -105,7 +105,7 @@ void VariableController::createVariable(const QString &name, // store the provider impl->m_VariableToProviderMap[newVariable] = provider; connect(provider.get(), &IDataProvider::dataProvided, newVariable.get(), - &Variable::onAddDataSeries); + &Variable::setDataSeries); // store in cache diff --git a/core/src/Variable/VariableModel.cpp b/core/src/Variable/VariableModel.cpp index e92a27a..f03350b 100644 --- a/core/src/Variable/VariableModel.cpp +++ b/core/src/Variable/VariableModel.cpp @@ -54,7 +54,7 @@ VariableModel::VariableModel(QObject *parent) std::shared_ptr VariableModel::createVariable(const QString &name, const SqpDateTime &dateTime, - std::unique_ptr defaultDataSeries) noexcept + std::shared_ptr defaultDataSeries) noexcept { auto insertIndex = rowCount(); beginInsertRows({}, insertIndex, insertIndex); diff --git a/plugins/mockplugin/include/CosinusProvider.h b/plugins/mockplugin/include/CosinusProvider.h index 218623a..bd5be77 100644 --- a/plugins/mockplugin/include/CosinusProvider.h +++ b/plugins/mockplugin/include/CosinusProvider.h @@ -13,7 +13,7 @@ Q_DECLARE_LOGGING_CATEGORY(LOG_CosinusProvider) class CosinusProvider : public IDataProvider { public: /// @sa IDataProvider::retrieveData() - std::unique_ptr + std::shared_ptr retrieveData(const DataProviderParameters ¶meters) const override; void requestDataLoading(const QVector &dateTimeList) override; diff --git a/plugins/mockplugin/src/CosinusProvider.cpp b/plugins/mockplugin/src/CosinusProvider.cpp index ee66ccf..0f4ae0b 100644 --- a/plugins/mockplugin/src/CosinusProvider.cpp +++ b/plugins/mockplugin/src/CosinusProvider.cpp @@ -9,47 +9,11 @@ Q_LOGGING_CATEGORY(LOG_CosinusProvider, "CosinusProvider") -std::unique_ptr +std::shared_ptr CosinusProvider::retrieveData(const DataProviderParameters ¶meters) const { auto dateTime = parameters.m_Time; - // Gets the timerange from the parameters - auto start = dateTime.m_TStart; - auto end = dateTime.m_TEnd; - - - // We assure that timerange is valid - if (end < start) { - std::swap(start, end); - } - - // Generates scalar series containing cosinus values (one value per second) - auto scalarSeries - = std::make_unique(end - start, Unit{QStringLiteral("t"), true}, Unit{}); - - auto dataIndex = 0; - for (auto time = start; time < end; ++time, ++dataIndex) { - scalarSeries->setData(dataIndex, time, std::cos(time)); - } - - return scalarSeries; -} - -void CosinusProvider::requestDataLoading(const QVector &dateTimeList) -{ - // NOTE: Try to use multithread if possible - for (const auto &dateTime : dateTimeList) { - - auto scalarSeries = this->retrieveDataSeries(dateTime); - - emit dataProvided(scalarSeries, dateTime); - } -} - - -std::shared_ptr CosinusProvider::retrieveDataSeries(const SqpDateTime &dateTime) -{ auto dataIndex = 0; // Gets the timerange from the parameters @@ -72,3 +36,12 @@ std::shared_ptr CosinusProvider::retrieveDataSeries(const SqpDateTi } return scalarSeries; } + +void CosinusProvider::requestDataLoading(const QVector &dateTimeList) +{ + // NOTE: Try to use multithread if possible + for (const auto &dateTime : dateTimeList) { + auto scalarSeries = this->retrieveData(DataProviderParameters{dateTime}); + emit dataProvided(scalarSeries, dateTime); + } +}