##// END OF EJS Templates
Add satic method to compute vector of in or not in ranges between...
Add satic method to compute vector of in or not in ranges between two ranges

File last commit:

r816:97f935302b90
r816:97f935302b90
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;
}