10#include <QtCore/QtGlobal>
20template <
typename ValueType>
36 TRange(ValueType minValue, ValueType maxValue);
288 ValueType m_minValue;
289 ValueType m_maxValue;
295template <
typename ValueType>
303template <
typename ValueType>
305 :m_minValue(range.m_minValue),
306 m_maxValue(range.m_maxValue)
311template <
typename ValueType>
313 :m_minValue(minValue),
319template <
typename ValueType>
322 return (m_minValue <= m_maxValue);
326template <
typename ValueType>
329 return (m_minValue == m_maxValue);
333template <
typename ValueType>
336 return (m_minValue < m_maxValue);
340template <
typename ValueType>
347template <
typename ValueType>
354template <
typename ValueType>
357 m_minValue = minValue;
361template <
typename ValueType>
364 ValueType absMin = std::abs(m_minValue);
365 ValueType absMax = std::abs(m_maxValue);
367 return std::min<ValueType>(absMin , absMax);
371template <
typename ValueType>
374 ValueType absMin = std::abs(m_minValue);
375 ValueType absMax = std::abs(m_maxValue);
377 return std::max<ValueType>(absMin, absMax);
381template <
typename ValueType>
388template <
typename ValueType>
395template <
typename ValueType>
398 m_maxValue = maxValue;
402template <
typename ValueType>
405 m_minValue = ValueType(0);
406 m_maxValue = ValueType(0);
410template <
typename ValueType>
413 return IsValid() ? m_maxValue - m_minValue: 0;
417template <
typename ValueType>
421 std::min<ValueType>(m_minValue, m_maxValue),
422 std::max<ValueType>(m_minValue, m_maxValue));
426template <
typename ValueType>
429 result.
SetMinValue(std::min<ValueType>(m_minValue, m_maxValue));
430 result.
SetMaxValue(std::max<ValueType>(m_minValue, m_maxValue));
434template <
typename ValueType>
437 *
this =
TRange(std::min<ValueType>(m_minValue, m_maxValue), std::max<ValueType>(m_minValue, m_maxValue));
441template <
typename ValueType>
446 return (value >= m_minValue) && (value <= m_maxValue);
450template <
typename ValueType>
456 return (range.m_minValue >= m_minValue) && (range.m_maxValue <= m_maxValue);
460template <
typename ValueType>
463 return (range.m_maxValue > m_minValue) && (range.m_minValue < m_maxValue);
467template <
typename ValueType>
470 return (range.m_maxValue <= m_minValue) || (range.m_minValue >= m_maxValue);
474template <
typename ValueType>
477 return TRange(m_minValue + offset, m_maxValue + offset);
481template <
typename ValueType>
484 m_minValue += offset;
485 m_maxValue += offset;
489template <
typename ValueType>
496 return TRange(std::max<ValueType>(m_minValue, range.m_minValue), std::min<ValueType>(m_maxValue, range.m_maxValue));
501template <
typename ValueType>
505 if (range.m_minValue > m_minValue){
506 m_minValue = range.m_minValue;
509 if (range.m_maxValue < m_maxValue){
510 m_maxValue = range.m_maxValue;
516template <
typename ValueType>
521 return TRange(std::min<ValueType>(m_minValue, range.m_minValue), std::max<ValueType>(m_maxValue, range.m_maxValue));
533template <
typename ValueType>
537 return TRange(std::min<ValueType>(m_minValue, value), std::max<ValueType>(m_maxValue, value));
540 return TRange(value, value);
545template <
typename ValueType>
550 if (range.m_minValue < m_minValue){
551 m_minValue = range.m_minValue;
554 if (range.m_maxValue > m_maxValue){
555 m_maxValue = range.m_maxValue;
565template <
typename ValueType>
569 if (value < m_minValue){
573 if (value > m_maxValue){
584template <
typename ValueType>
587 return TRange(m_minValue + range.m_minValue, m_maxValue + range.m_maxValue);
591template <
typename ValueType>
594 m_minValue += range.m_minValue;
595 m_maxValue += range.m_maxValue;
599template <
typename ValueType>
602 if (value > m_maxValue){
603 return value - m_maxValue;
606 if (value < m_minValue){
607 return m_minValue - value;
614template <
typename ValueType>
617 if (value > m_maxValue){
621 if (value < m_minValue){
629template <
typename ValueType>
632 if (!Contains(value)){
633 ValueType distanceMin = (ValueType)qAbs(value - m_minValue);
634 ValueType distanceMax = (ValueType)qAbs(value - m_maxValue);
636 return distanceMin < distanceMax ? m_minValue : m_maxValue;
643template <
typename ValueType>
660template <
typename ValueType>
663 return GetMinValue() + alpha * GetLength();
667template <
typename ValueType>
670 auto length =
static_cast<double>(GetLength());
672 return static_cast<double>(value - GetMinValue()) / length;
678template <
typename ValueType>
681 ValueType length = GetLength();
685 return (ValueType) 0.0;
689template <
typename ValueType>
693 result.m_minValue = GetValueFromAlpha(range.m_minValue);
694 result.m_maxValue = GetValueFromAlpha(range.m_maxValue);
700template <
typename ValueType>
705 double length = GetLength();
708 result.m_minValue = ValueType((range.m_minValue - m_minValue) / length);
709 result.m_maxValue = ValueType((range.m_maxValue - m_minValue) / length);
713 result.m_minValue = result.m_maxValue = 0.0;
720template <
typename ValueType>
725 ValueType minusWidth = m_minValue - m_maxValue;
728 result.m_minValue = ValueType(m_minValue / (
double)minusWidth);
729 result.m_maxValue = ValueType((m_minValue - 1) / (
double)minusWidth);
733 result.m_minValue = result.m_maxValue = 0.0;
740template <
typename ValueType>
743 double beta = 1 - alpha;
745 m_minValue = ValueType(first.m_minValue * beta + second.m_minValue * alpha);
746 m_maxValue = ValueType(first.m_maxValue * beta + second.m_maxValue * alpha);
750template <
typename ValueType>
753 return (m_maxValue == range.m_maxValue) && (m_minValue == range.m_minValue);
757template <
typename ValueType>
760 return (m_maxValue != range.m_maxValue) || (m_minValue != range.m_minValue);
765template <
typename ValueType>
768 m_maxValue = range.m_maxValue;
769 m_minValue = range.m_minValue;
775template <
typename ValueType>
780 result.m_minValue *= value;
781 result.m_maxValue *= value;
787template <
typename ValueType>
794 result.m_minValue /= value;
795 result.m_maxValue /= value;
799 result.m_minValue = result.m_maxValue = 0.0;
806template <
typename ValueType>
816template <
typename ValueType>
826 m_minValue = m_maxValue = 0.0;
835template <
typename ValueType>
838 return TRange(std::min<ValueType>(value1, value2), std::max<ValueType>(value1, value2));
844template <
typename ValueType>
852template <
typename ValueType>
Implementation of a abstract range defined by two values - minimum and maximum.
TRange & operator*=(double value)
bool operator==(const TRange &range) const
bool Contains(const TRange &range) const
Returns true, if this range is inside of the range.
void GetValidated(TRange &result) const
Get validated range, if it was invalid.
ValueType GetClipped(ValueType value) const
Get value clipped to the range.
TRange(const TRange &range)
Copy constructor.
TRange GetClipped(const TRange &range) const
Get range clipped to the current range.
TRange & operator/=(double value)
void Validate()
Force this range to be valid.
ValueType GetAbsMinValue() const
Get the minimum by the absolute value.
ValueType GetNearestInside(ValueType value) const
Get nearest value belonging to range.
TRange GetInverted() const
bool IsOutsideOf(const TRange &range) const
Check if this range is outside of the given range.
TRange operator/(double value) const
ValueType GetLength() const
Get length of this range.
void Unite(const TRange &range)
Set this range to be union of two ranges.
void Reset()
Set this range to be empty.
TRange(ValueType minValue, ValueType maxValue)
Constructs a range object from two numbers.
void Unite(double value)
Set this range to be union of two ranges.
static const TRange & GetInvalid()
Return invalid range.
void SetMinValue(ValueType minValue)
Set the bottom value.
TRange operator*(double value) const
TRange GetUnion(double value) const
Get union with the second range.
double GetAlphaFromValue(ValueType value) const
Get value based on 'alpha' factor.
TRange GetExpanded(const TRange &range) const
Get expanded range using the second range.
TRange()
Constructs an empty range object.
ValueType GetMaxValue() const
Get the top value.
ValueType GetValueFromAlpha(double alpha) const
Get value based on 'alpha' factor.
bool Contains(ValueType value) const
Returns true, if value is in range between top and bottom.
void Expand(const TRange &range)
Set this range to be expanded.
void Intersection(const TRange &range)
Set this range to be intersection of two ranges.
void SetInterpolated(const TRange &first, const TRange &second, double alpha)
Set this range to be linear interpolated using two other ranges and adjast alpha value.
static TRange GetValid(ValueType value1, ValueType value2)
Return always valid range.
TRange GetUnion(const TRange &range) const
Get union with the second range.
TRange GetTranslated(ValueType offset) const
Get translated position range.
ValueType GetMinValue() const
Get the bottom value.
bool IsEmpty() const
Return true if the bottom value is equal to the top value.
static const TRange & GetNull()
Return null range.
bool IsIntersectedBy(const TRange &range) const
Check if this range is intersected by other range.
bool IsValidNonEmpty() const
Return true if the range is valid and it is not empty.
void Translate(ValueType offset)
Translated position of this range.
ValueType & GetMinValueRef()
Get reference to the bottom value.
bool IsValid() const
Return true if the bottom value is smaller or equal then the top value.
TRange GetApply(const TRange &range) const
Get a combined range.
ValueType GetMappedTo(ValueType value, const TRange &range) const
Returns the value, that corresponds the input value inputValue in the other range range.
ValueType & GetMaxValueRef()
Get reference to the top value.
TRange GetIntersection(const TRange &range) const
Get intersection with the second range.
TRange GetInvertApply(const TRange &range) const
TRange & operator=(const TRange &range)
ValueType GetAbsMaxValue() const
Get the maximum by the absolute value.
bool operator!=(const TRange &range) const
ValueType GetDistance(ValueType value) const
Get distance from value to range.
void SetMaxValue(ValueType maxValue)
Set the top value.
TRange GetValidated() const
Get validated range, if it was invalid.
istd::TRange< int > CIntRange
istd::TRange< double > CRange