##// END OF EJS Templates
Updates UI to not call the sort method when update graphs, as data series are already sorted
Updates UI to not call the sort method when update graphs, as data series are already sorted

File last commit:

r451:240544c83cc8
r453:a8d8791b7e7a
Show More
DataSeries.h
180 lines | 5.8 KiB | text/x-c | CLexer
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 #ifndef SCIQLOP_DATASERIES_H
#define SCIQLOP_DATASERIES_H
Alexandre Leroux
Makes a Data series be sorted (2)...
r450 #include <Common/SortUtils.h>
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 #include <Data/ArrayData.h>
#include <Data/IDataSeries.h>
Correction for pull request
r243 #include <QLoggingCategory>
Add current progression for thread fix
r364 #include <QReadLocker>
#include <QReadWriteLock>
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 #include <memory>
Correction for pull request
r243 Q_DECLARE_LOGGING_CATEGORY(LOG_DataSeries)
Q_LOGGING_CATEGORY(LOG_DataSeries, "DataSeries")
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 /**
* @brief The DataSeries class is the base (abstract) implementation of IDataSeries.
*
Alexandre Leroux
Makes a Data series be sorted (1)
r449 * It proposes to set a dimension for the values ​​data.
*
* A DataSeries is always sorted on its x-axis data.
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 *
* @tparam Dim The dimension of the values data
*
*/
template <int Dim>
class DataSeries : public IDataSeries {
public:
/// @sa IDataSeries::xAxisData()
std::shared_ptr<ArrayData<1> > xAxisData() override { return m_XAxisData; }
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 const std::shared_ptr<ArrayData<1> > xAxisData() const { return m_XAxisData; }
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125
/// @sa IDataSeries::xAxisUnit()
Alexandre Leroux
Replaces QString unit by a new struct...
r177 Unit xAxisUnit() const override { return m_XAxisUnit; }
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125
/// @return the values dataset
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 std::shared_ptr<ArrayData<Dim> > valuesData() { return m_ValuesData; }
const std::shared_ptr<ArrayData<Dim> > valuesData() const { return m_ValuesData; }
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125
/// @sa IDataSeries::valuesUnit()
Alexandre Leroux
Replaces QString unit by a new struct...
r177 Unit valuesUnit() const override { return m_ValuesUnit; }
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125
Add current progression for thread fix
r364 void clear()
{
m_XAxisData->clear();
m_ValuesData->clear();
}
Alexandre Leroux
Handles merge of two data series
r451 /// Merges into the data series an other data series
/// @remarks the data series to merge with is cleared after the operation
Add merge API and implement it for the DataSeries
r233 void merge(IDataSeries *dataSeries) override
{
Alexandre Leroux
Handles merge of two data series
r451 dataSeries->lockWrite();
lockWrite();
if (auto other = dynamic_cast<DataSeries<Dim> *>(dataSeries)) {
const auto &otherXAxisData = other->xAxisData()->cdata();
const auto &xAxisData = m_XAxisData->cdata();
// As data series are sorted, we can improve performances of merge, by call the sort
// method only if the two data series overlap.
if (!otherXAxisData.empty()) {
auto firstValue = otherXAxisData.front();
auto lastValue = otherXAxisData.back();
auto xAxisDataBegin = xAxisData.cbegin();
auto xAxisDataEnd = xAxisData.cend();
bool prepend;
bool sortNeeded;
if (std::lower_bound(xAxisDataBegin, xAxisDataEnd, firstValue) == xAxisDataEnd) {
// Other data series if after data series
prepend = false;
sortNeeded = false;
}
else if (std::upper_bound(xAxisDataBegin, xAxisDataEnd, lastValue)
== xAxisDataBegin) {
// Other data series if before data series
prepend = true;
sortNeeded = false;
}
else {
// The two data series overlap
prepend = false;
sortNeeded = true;
}
// Makes the merge
m_XAxisData->add(*other->xAxisData(), prepend);
m_ValuesData->add(*other->valuesData(), prepend);
if (sortNeeded) {
sort();
}
}
// Clears the other data series
other->clear();
Add merge API and implement it for the DataSeries
r233 }
Correction for pull request
r243 else {
qCWarning(LOG_DataSeries())
Alexandre Leroux
Handles merge of two data series
r451 << QObject::tr("Detection of a type of IDataSeries we cannot merge with !");
Correction for pull request
r243 }
Alexandre Leroux
Handles merge of two data series
r451 unlock();
dataSeries->unlock();
Add merge API and implement it for the DataSeries
r233 }
Add current progression for thread fix
r364 virtual void lockRead() { m_Lock.lockForRead(); }
virtual void lockWrite() { m_Lock.lockForWrite(); }
virtual void unlock() { m_Lock.unlock(); }
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 protected:
Alexandre Leroux
Makes a Data series be sorted (1)
r449 /// Protected ctor (DataSeries is abstract). The vectors must have the same size, otherwise a
/// DataSeries with no values will be created.
/// @remarks data series is automatically sorted on its x-axis data
Alexandre Leroux
Fixes after review
r188 explicit DataSeries(std::shared_ptr<ArrayData<1> > xAxisData, const Unit &xAxisUnit,
std::shared_ptr<ArrayData<Dim> > valuesData, const Unit &valuesUnit)
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 : m_XAxisData{xAxisData},
Alexandre Leroux
Fixes after review
r188 m_XAxisUnit{xAxisUnit},
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 m_ValuesData{valuesData},
Alexandre Leroux
Fixes after review
r188 m_ValuesUnit{valuesUnit}
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 {
Alexandre Leroux
Makes a Data series be sorted (1)
r449 if (m_XAxisData->size() != m_ValuesData->size()) {
clear();
}
// Sorts data if it's not the case
const auto &xAxisCData = m_XAxisData->cdata();
if (!std::is_sorted(xAxisCData.cbegin(), xAxisCData.cend())) {
sort();
}
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 }
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 /// Copy ctor
explicit DataSeries(const DataSeries<Dim> &other)
: m_XAxisData{std::make_shared<ArrayData<1> >(*other.m_XAxisData)},
m_XAxisUnit{other.m_XAxisUnit},
m_ValuesData{std::make_shared<ArrayData<Dim> >(*other.m_ValuesData)},
m_ValuesUnit{other.m_ValuesUnit}
{
Alexandre Leroux
Makes a Data series be sorted (1)
r449 // Since a series is ordered from its construction and is always ordered, it is not
// necessary to call the sort method here ('other' is sorted)
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 }
/// Assignment operator
template <int D>
DataSeries &operator=(DataSeries<D> 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;
}
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 private:
Alexandre Leroux
Makes a Data series be sorted (1)
r449 /**
* Sorts data series on its x-axis data
*/
void sort() noexcept
{
Alexandre Leroux
Makes a Data series be sorted (2)...
r450 auto permutation = SortUtils::sortPermutation(*m_XAxisData, std::less<double>());
m_XAxisData = m_XAxisData->sort(permutation);
m_ValuesData = m_ValuesData->sort(permutation);
Alexandre Leroux
Makes a Data series be sorted (1)
r449 }
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 std::shared_ptr<ArrayData<1> > m_XAxisData;
Alexandre Leroux
Replaces QString unit by a new struct...
r177 Unit m_XAxisUnit;
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 std::shared_ptr<ArrayData<Dim> > m_ValuesData;
Alexandre Leroux
Replaces QString unit by a new struct...
r177 Unit m_ValuesUnit;
Add current progression for thread fix
r364
QReadWriteLock m_Lock;
Alexandre Leroux
Creates IDataSeries interface and its default implementation
r125 };
#endif // SCIQLOP_DATASERIES_H