##// END OF EJS Templates
Merge branch 'feature/AcqFixes' into develop
Merge branch 'feature/AcqFixes' into develop

File last commit:

r816:97f935302b90
r1275:73d2a50d0c6d merge
Show More
Variable.cpp
388 lines | 11.3 KiB | text/x-c | CppLexer
Alexandre Leroux
Changes Variable from struct to class
r163 #include "Variable/Variable.h"
Alexandre Leroux
Adds data series to a variable
r164 #include <Data/IDataSeries.h>
Change SqpRange for SqpDateTime
r512 #include <Data/SqpRange.h>
Variable slot is called when x range of its graph changed
r226
Add thread protection on variable
r541 #include <QMutex>
Add current progression for thread fix
r364 #include <QReadWriteLock>
#include <QThread>
Variable slot is called when x range of its graph changed
r226 Q_LOGGING_CATEGORY(LOG_Variable, "Variable")
Alexandre Leroux
Adds data series to a variable
r164
Alexandre Leroux
Changes Variable from struct to class
r163 struct Variable::VariablePrivate {
Fix bug when creating two variables crash the app. ...
r756 explicit VariablePrivate(const QString &name, const QVariantHash &metadata)
Alexandre Leroux
Fixed untimely update of the range to be displayed in the variable widget
r654 : m_Name{name},
Fix bug when creating two variables crash the app. ...
r756 m_Range{INVALID_RANGE},
m_CacheRange{INVALID_RANGE},
Alexandre Leroux
Fixed untimely update of the range to be displayed in the variable widget
r654 m_Metadata{metadata},
m_DataSeries{nullptr},
Alexandre Leroux
Creates attribute to get nb points of a variable
r716 m_RealRange{INVALID_RANGE},
m_NbPoints{0}
Alexandre Leroux
Changes Variable from struct to class
r163 {
}
Alexandre Leroux
Clones variable
r707 VariablePrivate(const VariablePrivate &other)
: m_Name{other.m_Name},
m_Range{other.m_Range},
Fix bug when creating two variables crash the app. ...
r756 m_CacheRange{other.m_CacheRange},
Alexandre Leroux
Clones variable
r707 m_Metadata{other.m_Metadata},
m_DataSeries{other.m_DataSeries != nullptr ? other.m_DataSeries->clone() : nullptr},
Alexandre Leroux
Creates attribute to get nb points of a variable
r716 m_RealRange{other.m_RealRange},
m_NbPoints{other.m_NbPoints}
Alexandre Leroux
Clones variable
r707 {
}
Add thread protection on variable
r541 void lockRead() { m_Lock.lockForRead(); }
void lockWrite() { m_Lock.lockForWrite(); }
void unlock() { m_Lock.unlock(); }
Alexandre Leroux
Calls purge() method when setting cache range or data series of a variable
r677 void purgeDataSeries()
{
if (m_DataSeries) {
m_DataSeries->purge(m_CacheRange.m_TStart, m_CacheRange.m_TEnd);
}
updateRealRange();
Alexandre Leroux
Updates variable attribute when data series is changing
r718 updateNbPoints();
Alexandre Leroux
Calls purge() method when setting cache range or data series of a variable
r677 }
Alexandre Leroux
Updates variable attribute when data series is changing
r718 void updateNbPoints() { m_NbPoints = m_DataSeries ? m_DataSeries->nbPoints() : 0; }
Alexandre Leroux
Fixed untimely update of the range to be displayed in the variable widget
r654 /// Updates real range according to current variable range and data series
void updateRealRange()
{
if (m_DataSeries) {
m_DataSeries->lockRead();
auto end = m_DataSeries->cend();
auto minXAxisIt = m_DataSeries->minXAxisData(m_Range.m_TStart);
auto maxXAxisIt = m_DataSeries->maxXAxisData(m_Range.m_TEnd);
Fix bug when creating two variables crash the app. ...
r756 m_RealRange
= (minXAxisIt != end && maxXAxisIt != end && minXAxisIt->x() <= maxXAxisIt->x())
? SqpRange{minXAxisIt->x(), maxXAxisIt->x()}
: INVALID_RANGE;
Alexandre Leroux
Fixed untimely update of the range to be displayed in the variable widget
r654 m_DataSeries->unlock();
}
else {
m_RealRange = INVALID_RANGE;
}
}
Alexandre Leroux
Changes Variable from struct to class
r163 QString m_Name;
Variable slot is called when x range of its graph changed
r226
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 SqpRange m_Range;
SqpRange m_CacheRange;
Alexandre Leroux
Adds QVariantHash to store metadata in a variable
r406 QVariantHash m_Metadata;
The dataSeries of a variable is now shared istead of uniq to avoid...
r542 std::shared_ptr<IDataSeries> m_DataSeries;
Alexandre Leroux
Fixed untimely update of the range to be displayed in the variable widget
r654 SqpRange m_RealRange;
Alexandre Leroux
Creates attribute to get nb points of a variable
r716 int m_NbPoints;
Add thread protection on variable
r541
QReadWriteLock m_Lock;
Alexandre Leroux
Changes Variable from struct to class
r163 };
Fix bug when creating two variables crash the app. ...
r756 Variable::Variable(const QString &name, const QVariantHash &metadata)
: impl{spimpl::make_unique_impl<VariablePrivate>(name, metadata)}
Alexandre Leroux
Changes Variable from struct to class
r163 {
}
Alexandre Leroux
Clones variable
r707 Variable::Variable(const Variable &other)
: impl{spimpl::make_unique_impl<VariablePrivate>(*other.impl)}
{
}
std::shared_ptr<Variable> Variable::clone() const
{
return std::make_shared<Variable>(*this);
}
Alexandre Leroux
Changes Variable from struct to class
r163 QString Variable::name() const noexcept
{
Add thread protection on variable
r541 impl->lockRead();
auto name = impl->m_Name;
impl->unlock();
return name;
Alexandre Leroux
Changes Variable from struct to class
r163 }
Alexandre Leroux
Sets variable name
r686 void Variable::setName(const QString &name) noexcept
{
impl->lockWrite();
impl->m_Name = name;
impl->unlock();
}
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 SqpRange Variable::range() const noexcept
The mock plugin can now create data with view operation
r235 {
Add thread protection on variable
r541 impl->lockRead();
auto range = impl->m_Range;
impl->unlock();
return range;
The mock plugin can now create data with view operation
r235 }
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 void Variable::setRange(const SqpRange &range) noexcept
Implementation of the new Dela T computation strategy
r260 {
Add thread protection on variable
r541 impl->lockWrite();
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 impl->m_Range = range;
Alexandre Leroux
Fixed untimely update of the range to be displayed in the variable widget
r654 impl->updateRealRange();
Add thread protection on variable
r541 impl->unlock();
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 }
SqpRange Variable::cacheRange() const noexcept
{
Add thread protection on variable
r541 impl->lockRead();
auto cacheRange = impl->m_CacheRange;
impl->unlock();
return cacheRange;
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 }
void Variable::setCacheRange(const SqpRange &cacheRange) noexcept
{
Add thread protection on variable
r541 impl->lockWrite();
Alexandre Leroux
Calls purge() method when setting cache range or data series of a variable
r677 if (cacheRange != impl->m_CacheRange) {
impl->m_CacheRange = cacheRange;
}
Add thread protection on variable
r541 impl->unlock();
Implementation of the new Dela T computation strategy
r260 }
Alexandre Leroux
Creates attribute to get nb points of a variable
r716 int Variable::nbPoints() const noexcept
{
return impl->m_NbPoints;
}
Alexandre Leroux
Fixed untimely update of the range to be displayed in the variable widget
r654 SqpRange Variable::realRange() const noexcept
{
return impl->m_RealRange;
}
Update Variable impl for v5
r538 void Variable::mergeDataSeries(std::shared_ptr<IDataSeries> dataSeries) noexcept
{
The dataSeries of a variable is now shared istead of uniq to avoid...
r542 qCDebug(LOG_Variable()) << "TORM Variable::mergeDataSeries"
Add thread protection on variable
r541 << QThread::currentThread()->objectName();
Update Variable impl for v5
r538 if (!dataSeries) {
/// @todo ALX : log
return;
}
// Add or merge the data
Add thread protection on variable
r541 impl->lockWrite();
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 if (!impl->m_DataSeries) {
impl->m_DataSeries = dataSeries->clone();
}
else {
The mock plugin can now create data with view operation
r235 impl->m_DataSeries->merge(dataSeries.get());
}
Alexandre Leroux
Calls purge() method when setting cache range or data series of a variable
r677 impl->purgeDataSeries();
Add thread protection on variable
r541 impl->unlock();
Alexandre Leroux
Adds data series to a variable
r164 }
Alexandre Leroux
Handles creations for scalar series
r182
Add satic method to compute vector of in or not in ranges between...
r816
The dataSeries of a variable is now shared istead of uniq to avoid...
r542 std::shared_ptr<IDataSeries> Variable::dataSeries() const noexcept
Alexandre Leroux
Handles creations for scalar series
r182 {
Add thread protection on variable
r541 impl->lockRead();
The dataSeries of a variable is now shared istead of uniq to avoid...
r542 auto dataSeries = impl->m_DataSeries;
Add thread protection on variable
r541 impl->unlock();
return dataSeries;
Alexandre Leroux
Handles creations for scalar series
r182 }
Variable slot is called when x range of its graph changed
r226
Alexandre Leroux
Adds QVariantHash to store metadata in a variable
r406 QVariantHash Variable::metadata() const noexcept
{
Add thread protection on variable
r541 impl->lockRead();
auto metadata = impl->m_Metadata;
impl->unlock();
return metadata;
Alexandre Leroux
Adds QVariantHash to store metadata in a variable
r406 }
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 bool Variable::contains(const SqpRange &range) const noexcept
Variable slot is called when x range of its graph changed
r226 {
Add thread protection on variable
r541 impl->lockRead();
auto res = impl->m_Range.contains(range);
impl->unlock();
return res;
Variable slot is called when x range of its graph changed
r226 }
Add intersect méthode on variable and sqpDateTime...
r258
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 bool Variable::intersect(const SqpRange &range) const noexcept
Add intersect méthode on variable and sqpDateTime...
r258 {
Add thread protection on variable
r541
impl->lockRead();
auto res = impl->m_Range.intersect(range);
impl->unlock();
return res;
Add intersect méthode on variable and sqpDateTime...
r258 }
The cache is now updated only if date requested has been successfully...
r318
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 bool Variable::isInside(const SqpRange &range) const noexcept
The cache is now updated only if date requested has been successfully...
r318 {
Add thread protection on variable
r541 impl->lockRead();
auto res = range.contains(SqpRange{impl->m_Range.m_TStart, impl->m_Range.m_TEnd});
impl->unlock();
return res;
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 }
bool Variable::cacheContains(const SqpRange &range) const noexcept
{
Add thread protection on variable
r541 impl->lockRead();
auto res = impl->m_CacheRange.contains(range);
impl->unlock();
return res;
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 }
bool Variable::cacheIntersect(const SqpRange &range) const noexcept
{
Add thread protection on variable
r541 impl->lockRead();
auto res = impl->m_CacheRange.intersect(range);
impl->unlock();
return res;
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 }
bool Variable::cacheIsInside(const SqpRange &range) const noexcept
{
Add thread protection on variable
r541 impl->lockRead();
auto res = range.contains(SqpRange{impl->m_CacheRange.m_TStart, impl->m_CacheRange.m_TEnd});
impl->unlock();
return res;
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 }
Add thread protection on variable
r541 QVector<SqpRange> Variable::provideNotInCacheRangeList(const SqpRange &range) const noexcept
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 {
Add method to get range in cacheRange
r570 // This code assume that cach in contigue. Can return 0, 1 or 2 SqpRange
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 auto notInCache = QVector<SqpRange>{};
Fix bug when creating two variables crash the app. ...
r756 if (impl->m_CacheRange != INVALID_RANGE) {
if (!this->cacheContains(range)) {
if (range.m_TEnd <= impl->m_CacheRange.m_TStart
|| range.m_TStart >= impl->m_CacheRange.m_TEnd) {
notInCache << range;
}
else if (range.m_TStart < impl->m_CacheRange.m_TStart
&& range.m_TEnd <= impl->m_CacheRange.m_TEnd) {
notInCache << SqpRange{range.m_TStart, impl->m_CacheRange.m_TStart};
}
else if (range.m_TStart < impl->m_CacheRange.m_TStart
&& range.m_TEnd > impl->m_CacheRange.m_TEnd) {
notInCache << SqpRange{range.m_TStart, impl->m_CacheRange.m_TStart}
<< SqpRange{impl->m_CacheRange.m_TEnd, range.m_TEnd};
}
else if (range.m_TStart < impl->m_CacheRange.m_TEnd) {
notInCache << SqpRange{impl->m_CacheRange.m_TEnd, range.m_TEnd};
}
else {
qCCritical(LOG_Variable()) << tr("Detection of unknown case.")
<< QThread::currentThread();
}
add CacheRange for Variable and the provideNotInCacheRangeList method
r532 }
}
Fix bug when creating two variables crash the app. ...
r756 else {
notInCache << range;
}
add CacheRange for Variable and the provideNotInCacheRangeList method
r532
return notInCache;
The cache is now updated only if date requested has been successfully...
r318 }
Add method to get range in cacheRange
r570
QVector<SqpRange> Variable::provideInCacheRangeList(const SqpRange &range) const noexcept
{
// This code assume that cach in contigue. Can return 0 or 1 SqpRange
auto inCache = QVector<SqpRange>{};
Fix bug when creating two variables crash the app. ...
r756 if (impl->m_CacheRange != INVALID_RANGE) {
Add satic method to compute vector of in or not in ranges between...
r816 if (this->cacheIntersect(range)) {
Fix bug when creating two variables crash the app. ...
r756 if (range.m_TStart <= impl->m_CacheRange.m_TStart
&& range.m_TEnd >= impl->m_CacheRange.m_TStart
&& range.m_TEnd < impl->m_CacheRange.m_TEnd) {
inCache << SqpRange{impl->m_CacheRange.m_TStart, range.m_TEnd};
}
else if (range.m_TStart >= impl->m_CacheRange.m_TStart
&& range.m_TEnd <= impl->m_CacheRange.m_TEnd) {
inCache << range;
}
else if (range.m_TStart > impl->m_CacheRange.m_TStart
&& range.m_TEnd > impl->m_CacheRange.m_TEnd) {
inCache << SqpRange{range.m_TStart, impl->m_CacheRange.m_TEnd};
}
else if (range.m_TStart <= impl->m_CacheRange.m_TStart
&& range.m_TEnd >= impl->m_CacheRange.m_TEnd) {
inCache << impl->m_CacheRange;
}
else {
qCCritical(LOG_Variable()) << tr("Detection of unknown case.")
<< QThread::currentThread();
}
Add method to get range in cacheRange
r570 }
}
return inCache;
}
Add satic method to compute vector of in or not in ranges between...
r816
QVector<SqpRange> Variable::provideNotInCacheRangeList(const SqpRange &oldRange,
const SqpRange &nextRange)
{
// This code assume that cach in contigue. Can return 0, 1 or 2 SqpRange
auto notInCache = QVector<SqpRange>{};
if (oldRange != INVALID_RANGE) {
if (!oldRange.contains(nextRange)) {
if (nextRange.m_TEnd <= oldRange.m_TStart || nextRange.m_TStart >= oldRange.m_TEnd) {
notInCache << nextRange;
}
else if (nextRange.m_TStart < oldRange.m_TStart
&& nextRange.m_TEnd <= oldRange.m_TEnd) {
notInCache << SqpRange{nextRange.m_TStart, oldRange.m_TStart};
}
else if (nextRange.m_TStart < oldRange.m_TStart && nextRange.m_TEnd > oldRange.m_TEnd) {
notInCache << SqpRange{nextRange.m_TStart, oldRange.m_TStart}
<< SqpRange{oldRange.m_TEnd, nextRange.m_TEnd};
}
else if (nextRange.m_TStart < oldRange.m_TEnd) {
notInCache << SqpRange{oldRange.m_TEnd, nextRange.m_TEnd};
}
else {
qCCritical(LOG_Variable()) << tr("Detection of unknown case.")
<< QThread::currentThread();
}
}
}
else {
notInCache << nextRange;
}
return notInCache;
}
QVector<SqpRange> Variable::provideInCacheRangeList(const SqpRange &oldRange,
const SqpRange &nextRange)
{
// This code assume that cach is contigue. Can return 0 or 1 SqpRange
auto inCache = QVector<SqpRange>{};
if (oldRange != INVALID_RANGE) {
if (oldRange.intersect(nextRange)) {
if (nextRange.m_TStart <= oldRange.m_TStart && nextRange.m_TEnd >= oldRange.m_TStart
&& nextRange.m_TEnd < oldRange.m_TEnd) {
inCache << SqpRange{oldRange.m_TStart, nextRange.m_TEnd};
}
else if (nextRange.m_TStart >= oldRange.m_TStart
&& nextRange.m_TEnd <= oldRange.m_TEnd) {
inCache << nextRange;
}
else if (nextRange.m_TStart > oldRange.m_TStart && nextRange.m_TEnd > oldRange.m_TEnd) {
inCache << SqpRange{nextRange.m_TStart, oldRange.m_TEnd};
}
else if (nextRange.m_TStart <= oldRange.m_TStart
&& nextRange.m_TEnd >= oldRange.m_TEnd) {
inCache << oldRange;
}
else {
qCCritical(LOG_Variable()) << tr("Detection of unknown case.")
<< QThread::currentThread();
}
}
}
return inCache;
}