QRange
A powerful user-friendly tool for working with numeric ranges in Qt.
 
Loading...
Searching...
No Matches
qrange.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore>
4
10{
11 Minus = -1,
12 Zero = 0,
13 Plus = 1
14};
15
25
34template <typename T>
35class QRange
36{
37public:
42 QRange() = default;
43 ~QRange() = default;
44
50 explicit QRange(T start, T end) : m_start { start }, m_end { end }
51 {
52 static_assert(is_normal_v, "[QRange::QRange] Typename T is partially or completely non-numeric!");
53
57 }
58
64 explicit QRange(std::pair<T, T> start_end)
65 : QRange{ start_end.first, start_end.second } {}
66
79 explicit QRange(QString start, QString end, uint8_t first_base, uint8_t second_base = 0)
80 : QRange{ normalizeValue(start, first_base), normalizeValue(end, second_base < 2 ? first_base : second_base) } {}
81
90 explicit QRange(QString start, T offset, uint8_t base)
91 : QRange{ normalizeValue(start, base), normalizeValue(start, base) + offset } {}
92
97 T start() const { return m_start; }
102 T end() const { return m_end; }
107 T lower() const { return std::min(m_start, m_end); }
112 T upper() const { return std::max(m_start, m_end); }
117 T middle() const { return static_cast<T>((lower() + upper()) / 2.0); }
122 double middleAccurate() const { return (lower() + upper()) / 2.0; }
127 T length() const { return std::abs(m_end - m_start); }
134
141 std::pair<QString, QString> toAnotherBase(uint8_t base) const
142 {
143 return { QString::number(m_start, base), QString::number(m_end, base) };
144 }
145
152 void setStart(const T start) { *this = QRange{ start, m_end }; }
159 void setEnd(const T end) { *this = QRange{ m_start, end }; }
160
168 {
170 qWarning() << "[QRange::setDirection] There is no way to change direction in zero length range!";
171 return;
172 }
173
174 if (static_cast<int>(direction) > 1 || static_cast<int>(direction) < -1) {
175 qWarning() << "[QRange::setDirection] Invalid direction!";
176 return;
177 }
178
179 if (direction == 0 && m_start != m_end) {
180 qWarning() << "[QRange::setDirection] There is no way to set direction to Zero in non-zero length range!";
181 return;
182 }
183
184 if (m_direction != direction)
185 std::swap(m_start, m_end);
186
188 }
189
195 {
196 switch (direction)
197 {
198 case -1:
200 break;
201 case 0:
203 break;
204 case 1:
206 break;
207 default:
208 qWarning() << "[QRange::setDirection] Invalid direction!";
209 break;
210 }
211 }
212
225 {
227 *this = QRange{ m_start * -1, m_end * -1 };
228
230 auto start = m_start > 0 ? m_start * -1 : m_start;
231 auto end = m_end > 0 ? m_end * -1 : m_end;
232 *this = QRange{ start, end };
233 }
234
236 auto start = m_start < 0 ? m_start * -1 : m_start;
237 auto end = m_end < 0 ? m_end * -1 : m_end;
238 *this = QRange{ start, end };
239 }
240 }
241
247 {
248 switch (direction)
249 {
250 case -1:
252 break;
253 case 0:
255 break;
256 case 1:
258 break;
259 default:
260 qWarning() << "[QRange::reverse] Invalid direction!";
261 break;
262 }
263 }
264
272 {
273 if (sensitivity == QRangeSensitivity::Sensitive)
274 return m_start > 0 && m_end > 0;
275 else if (sensitivity == QRangeSensitivity::Insensitive)
276 return m_start >= 0 && m_end >= 0;
277 qFatal("[QRange::isPositive] An unexpected error!");
278 }
279
287 {
288 if (sensitivity == QRangeSensitivity::Sensitive)
289 return m_start < 0 && m_end < 0;
290 else if (sensitivity == QRangeSensitivity::Insensitive)
291 return m_start <= 0 && m_end <= 0;
292 qFatal("[QRange::isNegative] An unexpected error!");
293 }
294
299 bool isMixed() const { return m_end * m_start < 0; }
304 bool isZero() const { return m_start == 0 && m_end == 0; }
305
313 bool contains(T number, QRangeSensitivity sensitivity = QRangeSensitivity::Sensitive) const
314 {
315 if (sensitivity == QRangeSensitivity::Sensitive)
316 return lower() < number && number < upper();
317 else if (sensitivity == QRangeSensitivity::Insensitive)
318 return lower() <= number && number <= upper();
319 qFatal("[QRange::contains] An unexpected error!");
320 }
321
329 bool contains(const QRange& range, QRangeSensitivity sensitivity = QRangeSensitivity::Sensitive) const
330 {
331 if (sensitivity == QRangeSensitivity::Sensitive)
332 return lower() < range.lower() && range.upper() < upper();
333 else if (sensitivity == QRangeSensitivity::Insensitive)
334 return lower() <= range.lower() && range.upper() <= upper();
335 qFatal("[QRange::contains] An unexpected error!");
336 }
337
345 bool in(const QRange& range, QRangeSensitivity sensitivity = QRangeSensitivity::Sensitive) const
346 {
347 if (sensitivity == QRangeSensitivity::Sensitive)
348 return range.lower() < lower() && upper() < range.upper();
349 else if (sensitivity == QRangeSensitivity::Insensitive)
350 return range.lower() <= lower() && upper() <= range.upper();
351 qFatal("[QRange::in] An unexpected error!");
352 }
353
361 bool overlays(const QRange& range, QRangeSensitivity sensitivity = QRangeSensitivity::Sensitive) const
362 {
363 return contains(range.m_start, sensitivity) || contains(range.m_end, sensitivity) || range.contains(m_start, sensitivity) || range.contains(m_end, sensitivity);
364 }
365
373 template <typename... Args>
374 static QRange min(const Args&... ranges)
375 {
376 return compareRanges(unpackRanges(ranges...), [](const QRange& r1, const QRange& r2) {
377 return r1.length() < r2.length();
378 });
379 }
380
388 template <typename... Args>
389 static QRange max(const Args&... ranges)
390 {
391 return compareRanges(unpackRanges(ranges...), [](const QRange& r1, const QRange& r2) {
392 return r1.length() > r2.length();
393 });
394 }
395
403 template <typename... Args>
404 static QRange minX(const Args&... ranges)
405 {
406 return compareRanges(unpackRanges(ranges...), [](const QRange& r1, const QRange& r2) {
407 return r1.lower() < r2.lower();
408 });
409 }
410
418 template <typename... Args>
419 static QRange maxX(const Args&... ranges)
420 {
421 return compareRanges(unpackRanges(ranges...), [](const QRange& r1, const QRange& r2) {
422 return r1.upper() > r2.upper();
423 });
424 }
425
438 template <typename... Args>
439 static QRange minMidX(const Args&... ranges)
440 {
441 return compareRanges(unpackRanges(ranges...), [](const QRange& r1, const QRange& r2) {
442 return r1.middleAccurate() < r2.middleAccurate();
443 });
444 }
445
458 template <typename... Args>
459 static QRange maxMidX(const Args&... ranges)
460 {
461 return compareRanges(unpackRanges(ranges...), [](const QRange& r1, const QRange& r2) {
462 return r1.middleAccurate() > r2.middleAccurate();
463 });
464 }
465
472 static QList<T> brake(const QList<QRange>& ranges)
473 {
474 QList<T> result;
475 for (const auto& range : ranges)
476 {
477 result.append(range.m_start);
478 result.append(range.m_end);
479 }
480 return result;
481 }
482
491 static QList<QRange> merge(const QList<T>& numbers)
492 {
493 QList<QRange> result;
494 auto editableNumbers = numbers;
495 while (!editableNumbers.isEmpty())
496 {
497 auto first = editableNumbers.takeFirst();
498 if (editableNumbers.isEmpty()) {
499 result.append(QRange{ first, first });
500 continue;
501 }
502
503 auto second = editableNumbers.takeFirst();
504 result.append(QRange{ first, second });
505 }
506 return result;
507 }
508
516 static QList<QRange> cut(const QRange& range, int number)
517 {
518 QList<QRange> result;
519
520 if (number == 0)
521 return { range };
522
523 if (number < 0)
524 qFatal("[QRange::cut] Incorrect number!");
525
526 if (number > range.length())
527 qWarning() << "[QRange::cut] number > range.length(), so method can work strange";
528
529 T step = range.length() / number;
530 step = range.direction() == QRangeDirection::Minus ? step * -1 : step;
531 T currentStart = range.start();
532 for (int i = 0; i < number; ++i)
533 {
534 T currentEnd = (i == number - 1) ? range.end() : currentStart + step;
535 result.emplace_back(QRange{ currentStart, currentEnd });
536 currentStart = currentEnd;
537 }
538
539 return result;
540 }
541
562 static QRange combine(const QList<QRange>& ranges, QRangeSensitivity sensitivity = QRangeSensitivity::Sensitive)
563 {
564 auto sortedRanges = ranges;
565 QRange result;
566
567 if (sensitivity == QRangeSensitivity::Sensitive) {
568 std::sort(sortedRanges.begin(), sortedRanges.end());
569 result = sortedRanges.first();
570
571 for (const auto& range : sortedRanges) {
572 if (result == range)
573 continue;
574
575 if (result.m_direction != range.m_direction
577 && range.m_direction != QRangeDirection::Zero)
578 qFatal("[QRange::combine] Ranges have different directions!");
579
580 if (!result.contains(range.m_start, QRangeSensitivity::Insensitive))
581 qFatal("[QRange::combine] There is a gap between ranges!");
582
583 result.setEnd(sortedRanges[sortedRanges.count() - 1].m_end);
584 }
585 } else if (sensitivity == QRangeSensitivity::Insensitive) {
586 result = sortedRanges.first();
587
588 const auto numbers = QRange::brake(sortedRanges);
589 const auto [min, max] = std::minmax_element(numbers.begin(), numbers.end());
590 result = QRange{ *min, *max };
591
592 if (result.m_direction != QRangeDirection::Zero) {
593 int countDirectionNegative = 0;
594 int countDirectionPositive = 0;
595
596 for (const QRange& range : sortedRanges) {
597 if (range.m_direction == QRangeDirection::Minus)
598 countDirectionNegative++;
599 else if (range.m_direction == QRangeDirection::Plus)
600 countDirectionPositive++;
601 }
602
603 if (countDirectionNegative > countDirectionPositive)
605 else
607 }
608 }
609
610 return result;
611 }
612
619 QRange operator+(T number) const { return QRange{ m_start + number, m_end + number }; }
620 QRange operator-(T number) const { return QRange{ m_start - number, m_end - number }; }
621 QRange operator*(T number) const { return QRange{ m_start * number, m_end * number }; }
622 QRange operator/(T number) const { return QRange{ m_start / number, m_end / number }; }
623 QRange operator%(T number) const { return QRange{ m_start % number, m_end % number }; }
624
631 std::pair<QRange, QRange> operator+(const QRange& range) const
632 {
634 return { *this, range };
635 if (contains(range))
636 return { *this, *this };
637 if (range.contains(*this))
638 return { range, range };
639
640 auto min = std::min({ m_start, m_end, range.m_start, range.m_end });
641 auto max = std::max({ m_start, m_end, range.m_start, range.m_end });
642 auto res = QRange{ min, max };
643 const auto direction = length() >= range.length()? m_direction : range.m_direction;
644 res.setDirection(direction);
645
646 return { res, res };
647 }
648
655 std::pair<QRange, QRange> operator-(const QRange& range) const
656 {
657 if (!overlays(range, QRangeSensitivity::Insensitive) || range.isZero())
658 return { *this, *this };
659
660 if (in(range)) {
661 qWarning() << "[QRange::operator-] The subtracted is greater than the reduced";
662 return range - *this;
663 }
664
665 if (contains(range)) {
666 auto resFirst = QRange{ lower(), range.lower() };
667 auto resSecond = QRange{ range.upper(), upper() };
668 resFirst.setDirection(m_direction);
669 resSecond.setDirection(m_direction);
670 return { resFirst, resSecond };
671 }
672
673 if (lower() == range.lower() && upper() == range.upper()) {
674 auto res = QRange{};
675 return { res, res };
676 }
677
678 const auto direction = length() >= range.length()? m_direction : range.m_direction;
679 if (middleAccurate() > range.middleAccurate()) {
680 auto res = QRange{ range.upper(), upper() };
681 res.setDirection(direction);
682 return { res, res };
683 } else if (middleAccurate() < range.middleAccurate()) {
684 auto res = QRange{ lower(), range.lower() };
685 res.setDirection(direction);
686 return { res, res };
687 }
688
689 qFatal("[QRange::operator-] An unexpected error!");
690 }
691
698 QRange operator*(const QRange& range) const
699 {
700 if (isZero() || range.isZero() || !overlays(range, QRangeSensitivity::Insensitive))
701 qFatal("[QRange::operator*] The result is ∅!");
702
704 return range;
706 return *this;
708 auto list = QList<T>{ m_start, m_end, range.m_start, range.m_end };
709 auto [min, max] = std::minmax_element(list.begin(), list.end());
710 list.removeOne(*min);
711 list.removeOne(*max);
712 auto res = QRange{ list.front(), list.back() };
713 if (res.length() != 0) {
714 auto direction = m_direction * range.m_direction;
715 res.setDirection(direction);
716 }
717
718 return res;
719 }
720 qFatal("[QRange::operator*] An unexpected error!");
721 }
722
729 std::pair<QRange, QRange> operator/(const QRange& range) const
730 {
732 || range.isZero()
733 || in(range)
734 || contains(range)
735 || (lower() == range.lower() && upper() == range.upper()))
736 return *this - range;
737
738 const auto direction = m_direction * range.m_direction;;
739 if (middleAccurate() > range.middleAccurate()) {
740 auto resFirst = QRange{ range.lower(), lower() };
741 auto resSecond = QRange{ range.upper(), upper() };
742 resFirst.setDirection(direction);
743 resSecond.setDirection(direction);
744 return { resFirst, resSecond };
745 } else if (middleAccurate() < range.middleAccurate()) {
746 auto resFirst = QRange{ lower(), range.lower() };
747 auto resSecond = QRange{ upper(), range.upper() };
748 resFirst.setDirection(direction);
749 resSecond.setDirection(direction);
750 return { resFirst, resSecond };
751 }
752
753 qFatal("[QRange::operator/] An unexpected error!");
754 }
755
762 bool operator>(const QRange& range) const { return maxMidX(range, *this) == *this; }
763 bool operator<(const QRange& range) const { return minMidX(range, *this) == *this; }
764
771 bool operator==(const QRange& range) const
772 {
773 return m_start == range.m_start && m_end == range.m_end && m_direction == range.m_direction;
774 }
775 bool operator!=(const QRange& range) const
776 {
777 return m_start != range.m_start || m_end != range.m_end || m_direction != range.m_direction;
778 }
779
786 bool operator>=(const QRange& range) const { return *this > range || *this == range; }
787 bool operator<=(const QRange& range) const { return *this < range || *this == range; }
788
789 friend std::ostream& operator<<(std::ostream &os, const QRange& range)
790 {
791 return os << range.getRangeInfo().toStdString();
792 }
793
794 friend QDebug operator<<(QDebug dbg, const QRange& range)
795 {
796 return dbg << range.getRangeInfo();
797 }
798
799protected:
800 T m_start{ 0 };
801 T m_end{ 0 };
803
821 static const bool is_normal_v = std::is_same<T, int>::value
822 || std::is_same<T, long>::value
823 || std::is_same<T, long long>::value
824 || std::is_same<T, unsigned int>::value
825 || std::is_same<T, unsigned long>::value
826 || std::is_same<T, unsigned long long>::value
827 || std::is_same<T, float>::value
828 || std::is_same<T, double>::value
829 || std::is_same<T, long double>::value;
830
839 using ArgsType = std::variant<QRange,
840 std::pair<QRange, QRange>,
841 QList<QRange>,
842 std::list<QRange>,
843 std::vector<QRange>>;
844
845private:
846 T normalizeValue(const QString& value, uint8_t base)
847 {
848 bool ok = false;
849
850 if constexpr (std::is_integral<T>::value)
851 {
852 if (std::is_same_v<T, int>)
853 return value.toInt(&ok, base);
854 else if (std::is_same_v<T, long>)
855 return value.toLong(&ok, base);
856 else if (std::is_same_v<T, long long>)
857 return value.toLongLong(&ok, base);
858 else if (std::is_same_v<T, unsigned int>)
859 return value.toUInt(&ok, base);
860 else if (std::is_same_v<T, unsigned long>)
861 return value.toULong(&ok, base);
862 else if (std::is_same_v<T, unsigned long long>)
863 return value.toULongLong(&ok, base);
864 else {
865 qWarning() << "[QRange::normalizeValue] Unsupported integer type.";
866 return 0;
867 }
868 } else if constexpr (std::is_floating_point_v<T>) {
869 if (std::is_same_v<T, float>)
870 return value.toFloat(&ok);
871 else if (std::is_same_v<T, double>)
872 return value.toDouble(&ok);
873 else if (std::is_same_v<T, long double>)
874 return static_cast<long double>(value.toDouble(&ok));
875 else {
876 qWarning() << "[QRange::normalizeValue] Unsupported floating-point type.";
877 return 0.0;
878 }
879 }
880
881 if (!ok) {
882 qCritical() << QString{ "[QRange::normalizeValue] Failed to convert string: %1!" }.arg(value);
883 return 0;
884 }
885 }
886
887 template <typename... Args>
888 static QList<QRange> unpackRanges(const Args&... args)
889 {
890 auto ranges = QList<QRange>{};
891 std::initializer_list<ArgsType> initArgs{ args... };
892 for (const auto& arg : initArgs)
893 unpackRange(ranges, arg);
894 return ranges;
895 }
896
897 static void unpackRange(QList<QRange>& allRanges, const ArgsType& arg)
898 {
899 std::visit([&](const auto& v) {
900 using VT = std::decay_t<decltype(v)>;
901 if constexpr (std::is_same_v<VT, QRange>)
902 allRanges.append(v);
903 else if constexpr (std::is_same_v<VT, std::pair<QRange, QRange>>)
904 allRanges.append({ v.first, v.second });
905 else if constexpr (std::is_same_v<VT, QList<QRange>>
906 || std::is_same_v<VT, std::list<QRange>>
907 || std::is_same_v<VT, std::vector<QRange>>)
908 allRanges.append(QList<QRange>{ v.begin(), v.end() });
909 else
910 qWarning() << "[QRange::unpackRanges] Unexpected variant type";
911 }, arg);
912 }
913
914 template <typename Comparator>
915 static QRange compareRanges(const QList<QRange>& ranges, Comparator cmp)
916 {
917 if (ranges.empty()) {
918 qWarning() << "[QRange::compareRanges] There is nothing to compare";
919 return QRange{};
920 }
921
922 auto result = ranges.first();
923
924 for (const auto& currentRange : ranges)
925 if (cmp(currentRange, result))
926 result = currentRange;
927
928 return result;
929 }
930
931 QString getRangeInfo() const
932 {
933 QString direction{"error"};
935 direction = "<--";
937 direction = "--><--";
939 direction = "-->";
940 QString property{"error"};
942 property = "+";
944 property = "-";
945 else if (isMixed())
946 property = m_start < 0 ? "-+" : "+-";
947 else if (isZero())
948 property = "0";
949 return QString{ "[%1, %2]: {length: %3, direction: %4, property: %5}" }
950 .arg(start())
951 .arg(end())
952 .arg(length())
953 .arg(direction)
954 .arg(property);
955 }
956};
void setEnd(const T end)
Sets the end of the range.
Definition qrange.h:159
double middleAccurate() const
Gets the exact center of the range, regardless of its generic type.
Definition qrange.h:122
bool operator>(const QRange &range) const
Operators >, <.
Definition qrange.h:762
static QRange combine(const QList< QRange > &ranges, QRangeSensitivity sensitivity=QRangeSensitivity::Sensitive)
Method connects ranges from a QList to a single range.
Definition qrange.h:562
void reverse(const QRangeDirection &direction=QRangeDirection::Zero)
This method changes the values of the start and end of the range relative to the x-axis.
Definition qrange.h:224
std::pair< QRange, QRange > operator/(const QRange &range) const
Operator / works the same way as the set complement operator.
Definition qrange.h:729
bool operator<(const QRange &range) const
Definition qrange.h:763
static QList< T > brake(const QList< QRange > &ranges)
Method converts all ranges in the list to a number list.
Definition qrange.h:472
QRange(std::pair< T, T > start_end)
QRange(std::pair<T, T> start_end) - A constructor that creates a range based on a pair of set values,...
Definition qrange.h:64
friend std::ostream & operator<<(std::ostream &os, const QRange &range)
Definition qrange.h:789
T middle() const
Gets the midpoint of the range.
Definition qrange.h:117
void setDirection(int direction)
Definition qrange.h:194
bool operator>=(const QRange &range) const
Operators >=, <=.
Definition qrange.h:786
QRange operator-(T number) const
Definition qrange.h:620
~QRange()=default
static QRange min(const Args &... ranges)
This method finds the minimum length range from a set of ranges.
Definition qrange.h:374
bool contains(T number, QRangeSensitivity sensitivity=QRangeSensitivity::Sensitive) const
This method checks whether a number is contained within the range.
Definition qrange.h:313
T m_start
Definition qrange.h:800
QRange operator*(const QRange &range) const
Operator * works the same way as the set intersection operator.
Definition qrange.h:698
QRange()=default
Constructs a null range. Null ranges are also considered zero.
QRange(QString start, T offset, uint8_t base)
QRange - A constructor that takes the beginning of the range in a defined calculus systems,...
Definition qrange.h:90
T m_end
Definition qrange.h:801
bool in(const QRange &range, QRangeSensitivity sensitivity=QRangeSensitivity::Sensitive) const
This method checks whether the source range is contained within the external range.
Definition qrange.h:345
QRange(T start, T end)
QRange(T start, T end) - the constructor with 2 parameters.
Definition qrange.h:50
friend QDebug operator<<(QDebug dbg, const QRange &range)
Definition qrange.h:794
T length() const
Gets the length of the range.
Definition qrange.h:127
QRange(QString start, QString end, uint8_t first_base, uint8_t second_base=0)
QRange(QString start, QString end, uint8_t first_base, uint8_t second_base = 0) - A constructor that ...
Definition qrange.h:79
T start() const
Gets the start of the range.
Definition qrange.h:97
T lower() const
Gets the lower bound of the range.
Definition qrange.h:107
QRange operator+(T number) const
Operators +, -, *, /, % perform the appropriate mathematical operations with the start and the end of...
Definition qrange.h:619
bool isPositive(QRangeSensitivity sensitivity=QRangeSensitivity::Sensitive) const
isPositive property. Checks the beginning and end of the range relative to the x-axis.
Definition qrange.h:271
bool isMixed() const
isMixed property. Checks the beginning and end of the range relative to the x-axis.
Definition qrange.h:299
QRangeDirection direction() const
Gets the direction of the range.
Definition qrange.h:133
static QList< QRange > cut(const QRange &range, int number)
Method cuts the range into equal parts, the number of which is determined by.
Definition qrange.h:516
bool overlays(const QRange &range, QRangeSensitivity sensitivity=QRangeSensitivity::Sensitive) const
This method checks whether one range overlaps with another.
Definition qrange.h:361
QRange operator/(T number) const
Definition qrange.h:622
QRangeDirection m_direction
Definition qrange.h:802
bool contains(const QRange &range, QRangeSensitivity sensitivity=QRangeSensitivity::Sensitive) const
This method checks whether an external range is contained within the source range.
Definition qrange.h:329
std::pair< QRange, QRange > operator-(const QRange &range) const
Operator - works the same way as the set difference operator.
Definition qrange.h:655
static const bool is_normal_v
The library works with certain types of numeric data described below:
Definition qrange.h:821
static QRange maxMidX(const Args &... ranges)
This method finds the range that is closest to plus infinity on the x-axis.
Definition qrange.h:459
bool operator!=(const QRange &range) const
Definition qrange.h:775
static QRange minX(const Args &... ranges)
This method finds the minimum range on the x-axis from a set of ranges.
Definition qrange.h:404
T end() const
Gets the end of the range.
Definition qrange.h:102
void setStart(const T start)
Sets the start of the range.
Definition qrange.h:152
static QRange maxX(const Args &... ranges)
This method finds the maximum range on the x-axis from a set of ranges.
Definition qrange.h:419
std::pair< QString, QString > toAnotherBase(uint8_t base) const
Gets the range in another base.
Definition qrange.h:141
bool operator<=(const QRange &range) const
Definition qrange.h:787
std::variant< QRange, std::pair< QRange, QRange >, QList< QRange >, std::list< QRange >, std::vector< QRange > > ArgsType
QRange also has several functions with a variable number of parameters. These functions use the alias...
Definition qrange.h:839
static QRange max(const Args &... ranges)
This method finds the maximum length range from a set of ranges.
Definition qrange.h:389
void setDirection(const QRangeDirection &direction)
Sets the direction of the range by swapping the start and end.
Definition qrange.h:167
QRange operator%(T number) const
Definition qrange.h:623
void reverse(int direction)
Definition qrange.h:246
QRange operator*(T number) const
Definition qrange.h:621
bool isNegative(QRangeSensitivity sensitivity=QRangeSensitivity::Sensitive) const
isNegative property. Checks the beginning and end of the range relative to the x-axis.
Definition qrange.h:286
bool isZero() const
isZero property.
Definition qrange.h:304
static QRange minMidX(const Args &... ranges)
This method finds the range that is closest to minus infinity on the x-axis.
Definition qrange.h:439
static QList< QRange > merge(const QList< T > &numbers)
Method converts a list of numbers to the list of ranges. If there is an even number of elements,...
Definition qrange.h:491
bool operator==(const QRange &range) const
Operators ==, !=.
Definition qrange.h:771
std::pair< QRange, QRange > operator+(const QRange &range) const
Operator + works the same way as the set union operator.
Definition qrange.h:631
T upper() const
Gets the upper bound of the range.
Definition qrange.h:112
QRangeSensitivity
Enum that determines the sensitivity of certain methods, such as contains().
Definition qrange.h:21
@ Insensitive
Definition qrange.h:23
@ Sensitive
Definition qrange.h:22
QRangeDirection
Enum defining the direction of the range.
Definition qrange.h:10
@ Plus
Definition qrange.h:13
@ Minus
Definition qrange.h:11
@ Zero
Definition qrange.h:12