##// END OF EJS Templates
Added true single threshold cache strategy and it behaves as expected...
Added true single threshold cache strategy and it behaves as expected Signed-off-by: Alexis Jeandet <alexis.jeandet@member.fsf.org>

File last commit:

r12:4e36a737f884
r12:4e36a737f884
Show More
DateTimeRangeHelper.h
62 lines | 2.1 KiB | text/x-c | CLexer
/ include / Data / DateTimeRangeHelper.h
#ifndef SCIQLOP_DATETIMERANGEHELPER_H
#define SCIQLOP_DATETIMERANGEHELPER_H
#include <cmath>
#include <variant>
#include <QObject>
#include <QDebug>
#include <opaque/numeric_typedef.hpp>
#include <Common/DateUtils.h>
#include <Common/MetaTypes.h>
#include <Common/Numeric.h>
#include <Data/DateTimeRange.h>
namespace DateTimeRangeHelper {
bool isnan(const DateTimeRange& range)
{
return std::isnan(range.m_TStart) && std::isnan(range.m_TEnd);
}
bool hasnan(const DateTimeRange& range)
{
return std::isnan(range.m_TStart) || std::isnan(range.m_TEnd);
}
bool isPureShift(const DateTimeRange& range1, const DateTimeRange& range2)
{
return SciQLop::numeric::almost_equal<double>(range1.delta(), range2.delta(), 1)
&& !SciQLop::numeric::almost_equal(range1.m_TStart, range2.m_TStart, 1);
}
bool isPureZoom(const DateTimeRange& range1, const DateTimeRange& range2)
{
return !SciQLop::numeric::almost_equal<double>(range1.delta(),range2.delta(),1)&&
SciQLop::numeric::almost_equal<double>(range1.center(), range2.center(),1);
}
/**
* @brief computeTransformation such as range2 = zoom*range1 + shift
* @param range1
* @param range2
* @return trnaformation applied to range1 to get range2 or an object of type
* InvalidDateTimeRangeTransformation if the transformation has NaN or forbiden values
*/
std::variant<DateTimeRangeTransformation, InvalidDateTimeRangeTransformation>
computeTransformation(const DateTimeRange& range1, const DateTimeRange& range2)
{
double zoom = range2.delta()/range1.delta();
Seconds<double> shift = range2.center() - (range1*zoom).center();
bool zoomValid = zoom!=0. && !std::isnan(zoom) && !std::isinf(zoom);
bool shiftValid = !std::isnan(shift.value) && !std::isinf(shift.value);
if(zoomValid && shiftValid)
return DateTimeRangeTransformation{zoom, shift};
return InvalidDateTimeRangeTransformation{};
}
}
#endif // SCIQLOP_DATETIMERANGEHELPER_H