61 using mapped_type = T;
64 using value_type = std::pair<key_type, mapped_type>;
65 using size_type =
typename std::vector<value_type>::size_type;
66 using difference_type =
typename std::vector<value_type>::difference_type;
68 using allocator_type =
typename std::vector<value_type>::allocator_type;
69 using reference =
typename std::vector<value_type>::reference;
70 using const_reference =
typename std::vector<value_type>::const_reference;
71 using pointer =
typename std::vector<value_type>::pointer;
72 using const_pointer =
typename std::vector<value_type>::const_pointer;
73 using iterator =
typename std::vector<value_type>::iterator;
74 using const_iterator =
typename std::vector<value_type>::const_iterator;
75 using reverse_iterator =
typename std::vector<value_type>::reverse_iterator;
76 using const_reverse_iterator =
typename std::vector<value_type>::const_reverse_iterator;
85 using is_transparent = std::true_type;
93 [[nodiscard]]
constexpr bool operator()(
typename key_compare::range_t lhs,
94 value_type
const& rhs)
const
96 return comp_(lhs, rhs.first);
99 [[nodiscard]]
constexpr bool operator()(value_type
const& lhs,
100 typename key_compare::range_t rhs)
102 return comp_(lhs.first, rhs);
115 template <
class InputIt,
116 typename = std::enable_if_t<std::is_base_of_v<
117 std::input_iterator_tag,
118 typename std::iterator_traits<InputIt>::iterator_category>>>
119 RangeMap(InputIt first, InputIt last)
124 RangeMap(RangeMap
const& other) : ranges_(other.ranges_) {}
126 template <
typename Key2>
127 RangeMap(RangeMap<Key2, T>
const& other)
130 insert(std::cbegin(other), std::cend(other));
133 RangeMap(RangeMap&& other) : ranges_(
std::move(other.ranges_)) {}
135 RangeMap(std::initializer_list<value_type> init) { insert(init); }
147 RangeMap& operator=(RangeMap
const& other)
149 ranges_ = other.ranges_;
153 template <
typename Key2>
154 RangeMap& operator=(RangeMap<Key2, T>
const& other)
158 insert(std::cbegin(other), std::cend(other));
162 RangeMap& operator=(RangeMap&& other)
164 ranges_ = std::move(other.ranges_);
168 RangeMap& operator=(std::initializer_list<value_type> ilist)
179 allocator_type get_allocator() const noexcept {
return ranges_.get_allocator(); }
187 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
188 [[nodiscard]] T
const& get(K key)
192 throw std::out_of_range(
"Key is not stored in the container.");
201 iterator begin() noexcept {
return std::begin(ranges_); }
203 const_iterator begin() const noexcept {
return std::begin(ranges_); }
205 const_iterator cbegin() const noexcept {
return std::cbegin(ranges_); }
207 iterator end() noexcept {
return std::end(ranges_); }
209 const_iterator end() const noexcept {
return std::end(ranges_); }
211 const_iterator cend() const noexcept {
return std::cend(ranges_); }
213 reverse_iterator rbegin() noexcept {
return std::rbegin(ranges_); }
215 const_reverse_iterator rbegin() const noexcept {
return std::rbegin(ranges_); }
217 const_reverse_iterator crbegin() const noexcept {
return std::crbegin(ranges_); }
219 reverse_iterator rend() noexcept {
return std::rend(ranges_); }
221 const_reverse_iterator rend() const noexcept {
return std::rend(ranges_); }
223 const_reverse_iterator crend() const noexcept {
return std::crend(ranges_); }
229 [[nodiscard]]
bool empty() const noexcept {
return ranges_.empty(); }
231 [[nodiscard]] size_type size() const noexcept {
return ranges_.size(); }
233 [[nodiscard]] size_type max_size() const noexcept {
return ranges_.max_size(); }
235 [[nodiscard]] size_type numRanges() const noexcept {
return size(); }
237 template <
typename Key2 = Key>
238 [[nodiscard]] std::enable_if_t<std::is_integral_v<Key2>, size_type> numValues()
const
240 return std::accumulate(begin(), end(), numRanges(), [](
auto cur,
auto elem) {
241 return cur + (elem.first.upper() - elem.first.lower());
249 void clear() noexcept { ranges_.clear(); }
251 std::pair<iterator, bool> insert(value_type
const& value)
253 std::cout << value.first.lower() <<
' ' << value.first.upper() <<
'\n';
254 key_type key = value.first;
259 Key
const lower_up = decrement(key.lower());
264 Key
const upper_op = increment(key.upper());
266 auto [lower, upper] = equal_range(lower_up, key.upper());
268 if (end() == lower) {
273 ranges_.push_back(value);
274 return {std::prev(end()),
true};
275 }
else if (lower == upper && upper_op < upper->first.lower()) {
280 auto it = ranges_.insert(lower, value);
285 auto lower_dist = std::distance(begin(), lower);
286 auto upper_dist = std::distance(begin(), upper);
288 bool inserted =
false;
296 if (lower_up == lower->first.upper() && value.second != lower->second) {
297 auto lower_next = std::next(lower);
298 if (value.second == lower_next->second) {
300 lower_next->first.setRange(key.lower(), lower_next->first.upper());
303 ranges_.emplace(lower_next, key_type(key.lower()), value.second);
307 }
else if (key.lower() < lower->first.lower()) {
308 if (increment(key.lower()) < lower->first.lower() ||
309 value.second != lower->second) {
311 ranges_.emplace(lower, key_type(key.lower(), decrement(lower->first.lower())),
316 lower->first.setRange(key.lower(), lower->first.upper());
320 lower = std::next(begin(), lower_dist);
321 upper = std::next(begin(), upper_dist);
327 auto upper_prev = std::prev(upper);
329 if (end() == upper) {
330 if (value.second == upper_prev->second) {
332 upper_prev->first.setRange(upper_prev->first.lower(), key.upper());
336 ranges_.emplace_back(key_type(increment(upper_prev->first.upper()), key.upper()),
339 }
else if (key.upper() < upper->first.lower()) {
340 if (upper_op < upper->first.lower() || value.second != upper->second) {
342 ranges_.emplace(upper,
343 key_type(increment(upper_prev->first.upper()), key.upper()),
347 upper->first.setRange(key.upper(), upper->first.upper());
351 lower = std::next(begin(), lower_dist);
352 upper = std::next(begin(), upper_dist);
358 for (
auto it = lower; it != upper; ++it) {
359 if (value.second == it->second) {
362 auto it_next = std::next(it);
363 if (value.second == it_next->second) {
365 it_next->first.setRange(increment(it->first.upper()), it_next->first.upper());
366 }
else if (increment(it->first.upper()) <= decrement(it_next->first.lower())) {
370 key_type(increment(it->first.upper()), decrement(it_next->first.lower())),
376 lower = std::next(begin(), lower_dist);
377 upper = std::next(begin(), upper_dist);
379 for (
auto it = lower; it != std::prev(upper);) {
380 if (value.second != it->second) {
383 auto it_next = std::next(it);
384 if (value.second == it_next->second) {
386 it->first.setRange(it->first.lower(), it_next->first.upper());
390 upper = std::next(begin(), upper_dist);
393 it->first.setRange(it->first.lower(), decrement(it_next->first.lower()));
398 lower = std::next(begin(), lower_dist);
399 upper = std::next(begin(), upper_dist);
401 return {lower, inserted};
405 typename = std::enable_if_t<std::is_constructible_v<value_type, P&&>>>
406 std::pair<iterator, bool> insert(P&& value)
408 return emplace(std::forward<P>(value));
411 std::pair<iterator, bool> insert(value_type&& value)
413 key_type key = value.first;
418 Key
const lower_up = decrement(key.lower());
423 Key
const upper_op = increment(key.upper());
425 auto [lower, upper] = equal_range(lower_up, key.upper());
427 if (end() != lower && lower->first.upper() < key.lower() &&
428 value.second != lower->second) {
436 if (end() == lower) {
440 ranges_.push_back(value);
441 return {std::prev(end()),
true};
442 }
else if (lower == upper) {
443 if (upper_op < lower->first.lower() ||
444 (key.upper() < lower->first.lower() && value.second != lower->second)) {
448 auto it = ranges_.insert(lower, value);
450 }
else if (value.second == lower->second) {
451 bool inserted = key.lower() < lower->first.lower();
452 lower->first.setRange(std::min(key.lower(), lower->first.lower()),
453 lower->first.upper());
454 return {lower, inserted};
455 }
else if (key.lower() < lower->first.lower()) {
456 lower = ranges_.emplace(
457 lower, key_type(key.lower(), decrement(lower->first.lower())), value.second);
458 return {lower,
true};
460 return {lower,
false};
465 upper = end() != upper ? upper : std::prev(upper);
467 auto lower_dist = std::distance(begin(), lower);
468 auto upper_dist = std::distance(begin(), upper);
470 bool inserted =
false;
473 if (key.lower() < lower->first.lower()) {
475 if (value.second == lower->second) {
477 lower->first.setRange(key.lower(), lower->first.upper());
480 lower = ranges_.emplace(
481 lower, key_type(key.lower(), decrement(lower->first.lower())), value.second);
483 upper = std::next(begin(), upper_dist);
488 if (key.upper() > upper->first.upper()) {
490 if (value.second == upper->second) {
492 upper->first.setRange(upper->first.lower(), key.upper());
495 upper = ranges_.emplace(std::next(upper),
496 key_type(increment(upper->first.upper()), key.upper()),
498 lower = std::next(begin(), lower_dist);
501 }
else if (upper_op < upper->first.lower()) {
503 auto upper_prev = std::prev(upper);
505 if (value.second == upper_prev->second) {
507 upper_prev->first.setRange(upper_prev->first.lower(), key.upper());
510 }
else if (increment(upper_prev->first.upper()) < key.upper()) {
512 upper = ranges_.emplace(
513 upper, key_type(increment(upper_prev->first.upper()), key.upper()),
515 lower = std::next(begin(), lower_dist);
520 for (
auto it = std::next(lower); std::next(upper) != it; ++it) {
521 auto it_prev = std::prev(it);
522 if (value.second == it_prev->second) {
523 if (value.second == it->second) {
526 it_prev->first.setRange(it_prev->first.lower(), it->first.upper());
532 auto old = it_prev->first;
533 it_prev->first.setRange(it_prev->first.lower(), decrement(it->first.lower()));
534 inserted = inserted || old != it_prev->first;
536 }
else if (value.second == it->second) {
538 auto old = it->first;
539 it->first.setRange(increment(it_prev->first.upper()), it->first.upper());
540 inserted = inserted || old != it->first;
541 }
else if (
auto temp = increment(it_prev->first.upper());
542 temp < it->first.lower()) {
545 it = ranges_.emplace(it, key_type(temp, decrement(it->first.lower())),
549 upper = std::next(begin(), upper_dist);
552 lower = std::next(begin(), lower_dist);
553 if (end() != upper && upper->first.upper() <= key.upper()) {
556 return {lower, inserted};
559 iterator insert(const_iterator hint, value_type
const& value)
562 return insert(value).first;
566 iterator insert(const_iterator hint, P&& value)
569 return insert(std::forward<P>(value)).first;
572 iterator insert(const_iterator hint, value_type&& value)
575 return insert(std::forward<value_type>(value)).first;
578 template <
class InputIt,
579 typename = std::enable_if_t<std::is_base_of_v<
580 std::input_iterator_tag,
581 typename std::iterator_traits<InputIt>::iterator_category>>>
582 void insert(InputIt first, InputIt last)
585 std::for_each(first, last, [
this](
auto&&... args) { this->insert(args...); });
588 void insert(std::initializer_list<value_type> ilist)
590 insert(std::cbegin(ilist), std::cend(ilist));
603 std::pair<iterator, bool> insert_or_assign(key_type key, M&& obj)
608 Key
const lower_up = decrement(key.lower());
613 Key
const upper_op = increment(key.upper());
615 auto [lower, upper] = equal_range(lower_up, key.upper());
618 if (end() != lower && lower->first.upper() < key.lower() && obj != lower->second) {
622 if (end() == lower) {
626 ranges_.emplace_back(key, std::forward<M>(obj));
627 return {std::prev(end()),
true};
628 }
else if (lower == upper) {
629 if (upper_op < lower->first.lower() ||
630 (key.upper() < lower->first.lower() && obj != lower->second)) {
634 lower = ranges_.emplace(lower, key, std::forward<M>(obj));
635 return {lower,
true};
636 }
else if (obj == lower->second) {
638 bool inserted = key.lower() < lower->first.lower();
639 lower->first.setRange(std::min(key.lower(), lower->first.lower()),
640 lower->first.upper());
641 return {lower, inserted};
642 }
else if (key.lower() <= lower->first.lower()) {
644 lower->first.setRange(upper_op, lower->first.upper());
645 lower = ranges_.emplace(lower, key, std::forward<M>(obj));
646 return {lower,
true};
649 auto max = lower->first.upper();
650 lower->first.setRange(lower->first.lower(), decrement(key.lower()));
651 lower = ranges_.emplace(std::next(lower), key_type(increment(key.upper()),
max),
653 lower = ranges_.emplace(lower, key, std::forward<M>(obj));
654 return {lower,
true};
658 bool inserted =
false;
661 if (lower->first.lower() < key.lower()) {
662 if (lower->second == obj) {
663 key.setRange(lower->first.lower(), key.upper());
665 lower->first.setRange(lower->first.lower(), decrement(key.lower()));
668 if (end() == lower) {
669 ranges_.emplace_back(key, std::forward<M>(obj));
670 return {std::prev(end()),
true};
676 if (end() != upper) {
677 if (upper->second != obj) {
678 upper->first.setRange(std::max(upper_op, upper->first.lower()),
679 upper->first.upper());
680 }
else if (upper_op >= upper->first.lower()) {
681 key.setRange(key.lower(), upper->first.upper());
686 if (lower == upper) {
687 lower = ranges_.emplace(lower, key, std::forward<M>(obj));
688 return {lower,
true};
692 auto lower_dist = std::distance(begin(), lower);
693 erase(std::next(lower), upper);
694 lower = std::next(begin(), lower_dist);
698 lower->second = std::forward<M>(obj);
700 return {lower, inserted};
704 iterator insert_or_assign(const_iterator hint, key_type key, M&& obj)
707 return insert_or_assign(key, std::forward<M>(obj)).first;
710 template <
class... Args>
711 std::pair<iterator, bool> emplace(Args&&... args)
714 return insert(value_type(std::forward<Args>(args)...));
717 template <
class... Args>
718 iterator emplace_hint(const_iterator hint, Args&&... args)
721 return emplace(std::forward<Args>(args)...).first;
724 template <
class... Args>
725 std::pair<iterator, bool> try_emplace(key_type k, Args&&... args)
728 return insert(value_type(std::piecewise_construct, std::forward_as_tuple(k),
729 std::forward_as_tuple(std::forward<Args>(args)...)));
732 template <
class... Args>
733 iterator try_emplace(const_iterator hint, key_type k, Args&&... args)
736 return try_emplace(k, std::forward<Args>(args)...).first;
739 iterator erase(const_iterator pos) {
return ranges_.erase(pos); }
741 iterator erase(const_iterator first, const_iterator last)
743 return ranges_.erase(first, last);
746 size_type erase(key_type key)
750 auto [lower, upper] = equal_range(key);
752 Key
const lower_up = decrement(key.lower());
753 Key
const upper_op = increment(key.upper());
755 size_type num_removed = 0;
757 if (end() == lower || (lower == upper && key.upper() < lower->first.lower())) {
759 }
else if (lower == upper) {
762 if (key.lower() <= lower->first.lower()) {
764 lower->first.setRange(upper_op, lower->first.upper());
767 auto cur_upper = lower->first.upper();
768 lower->first.setRange(lower->first.lower(), lower_up);
769 ranges_.emplace(std::next(lower), upper_op, cur_upper);
772 if (end() != upper) {
773 num_removed = upper->first.lower() < upper_op ? 1 : 0;
774 upper->first.setRange(std::max(upper->first.lower(), upper_op),
775 upper->first.upper());
778 num_removed += std::distance(lower, upper);
780 if (key.lower() <= lower->first.lower()) {
782 ranges_.erase(lower, upper);
785 lower->first.setRange(lower->first.lower(), lower_up);
786 ranges_.erase(std::next(lower), upper);
793 template <
typename Key2>
794 size_type erase(Range<Key2> key)
796 return erase(key_type(key));
799 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
800 size_type erase(K key)
802 return erase(key_type(key));
805 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
806 size_type erase(K lower, K upper)
808 return erase(key_type(lower, upper));
811 void swap(RangeMap& other)
noexcept(
812 std::allocator_traits<allocator_type>::is_always_equal::value &&
813 std::is_nothrow_move_assignable<value_compare>::value)
816 ranges_.swap(other.ranges_);
837 [[nodiscard]] size_type count(key_type key)
const {
return contains(key) ? 1 : 0; }
839 template <
typename Key2>
840 [[nodiscard]] size_type count(Range<Key2> key)
842 return count(key_type(key));
845 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
846 [[nodiscard]] size_type count(K key)
848 return count(key_type(key));
851 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
852 [[nodiscard]] size_type count(K lower, K upper)
854 return count(key_type(lower, upper));
857 iterator find(key_type key)
861 auto lower = lower_bound(key);
863 return end() != lower && lower->first.lower() <= key.lower() &&
864 lower->first.upper() >= key.upper()
869 template <
typename Key2>
870 iterator find(Range<Key2> key)
872 return find(key_type(key));
875 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
878 return find(key_type(key));
881 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
882 iterator find(K lower, K upper)
884 return find(key_type(lower, upper));
887 const_iterator find(key_type key)
const
891 auto lower = lower_bound(key);
893 return end() != lower && lower->first.lower() <= key.lower() &&
894 lower->first.upper() >= key.upper()
899 template <
typename Key2>
900 const_iterator find(Range<Key2> key)
const
902 return find(key_type(key));
905 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
906 const_iterator find(K key)
const
908 return find(key_type(key));
911 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
912 const_iterator find(K lower, K upper)
const
914 return find(key_type(lower, upper));
917 [[nodiscard]]
bool contains(key_type key)
const
921 auto lower = lower_bound(key);
922 return end() != lower && lower->first.lower() <= key.lower() &&
923 lower->first.upper() >= key.upper();
926 template <
typename Key2>
927 [[nodiscard]]
bool contains(Range<Key2> key)
const
929 return contains(key_type(key));
932 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
933 [[nodiscard]]
bool contains(K key)
const
935 return contains(key_type(key));
938 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
939 [[nodiscard]]
bool contains(K lower, K upper)
const
941 return contains(key_type(lower, upper));
944 [[nodiscard]] std::pair<iterator, iterator> equal_range(key_type key)
946 typename key_compare::range_t
const s_range{key.lower(), key.upper()};
947 return std::equal_range(begin(), end(), s_range, comp_);
950 template <
typename Key2>
951 [[nodiscard]] std::pair<iterator, iterator> equal_range(Range<Key2> key)
953 return equal_range(key_type(key));
956 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
957 [[nodiscard]] std::pair<iterator, iterator> equal_range(K key)
959 return equal_range(key_type(key));
962 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
963 [[nodiscard]] std::pair<iterator, iterator> equal_range(K lower, K upper)
965 return equal_range(key_type(lower, upper));
968 [[nodiscard]] std::pair<const_iterator, const_iterator> equal_range(key_type key)
const
970 typename key_compare::range_t
const s_range{key.lower(), key.upper()};
971 return std::equal_range(begin(), end(), s_range, comp_);
974 template <
typename Key2>
975 [[nodiscard]] std::pair<const_iterator, const_iterator> equal_range(
976 Range<Key2> key)
const
978 return equal_range(key_type(key));
981 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
982 [[nodiscard]] std::pair<const_iterator, const_iterator> equal_range(K key)
const
984 return equal_range(key_type(key));
987 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
988 [[nodiscard]] std::pair<const_iterator, const_iterator> equal_range(K lower,
991 return equal_range(key_type(lower, upper));
994 [[nodiscard]] iterator lower_bound(key_type key)
996 typename key_compare::range_t
const s_range{key.lower(), key.upper()};
997 return std::lower_bound(begin(), end(), s_range, comp_);
1000 template <
typename Key2>
1001 [[nodiscard]] iterator lower_bound(Range<Key2> key)
1003 return lower_bound(key_type(key));
1006 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1007 [[nodiscard]] iterator lower_bound(K key)
1009 return lower_bound(key_type(key));
1012 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1013 [[nodiscard]] iterator lower_bound(K lower, K upper)
1015 return lower_bound(key_type(lower, upper));
1018 [[nodiscard]] const_iterator lower_bound(key_type key)
const
1020 typename key_compare::range_t
const s_range{key.lower(), key.upper()};
1021 return std::lower_bound(begin(), end(), s_range, comp_);
1024 template <
typename Key2>
1025 [[nodiscard]] const_iterator lower_bound(Range<Key2> key)
const
1027 return lower_bound(key_type(key));
1030 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1031 [[nodiscard]] const_iterator lower_bound(K key)
const
1033 return lower_bound(key_type(key));
1036 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1037 [[nodiscard]] const_iterator lower_bound(K lower, K upper)
const
1039 return lower_bound(key_type(lower, upper));
1042 [[nodiscard]] iterator upper_bound(key_type key)
1044 typename key_compare::range_t
const s_range{key.lower(), key.upper()};
1045 return std::upper_bound(begin(), end(), s_range, comp_);
1048 template <
typename Key2>
1049 [[nodiscard]] iterator upper_bound(Range<Key2> key)
1051 return upper_bound(key_type(key));
1054 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1055 [[nodiscard]] iterator upper_bound(K key)
1057 return upper_bound(key_type(key));
1060 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1061 [[nodiscard]] iterator upper_bound(K lower, K upper)
1063 return upper_bound(key_type(lower, upper));
1066 [[nodiscard]] const_iterator upper_bound(key_type key)
const
1068 typename key_compare::range_t
const s_range{key.lower(), key.upper()};
1069 return std::upper_bound(begin(), end(), s_range, comp_);
1072 template <
typename Key2>
1073 [[nodiscard]] const_iterator upper_bound(Range<Key2> key)
const
1075 return upper_bound(key_type(key));
1078 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1079 [[nodiscard]] const_iterator upper_bound(K value)
const
1081 return upper_bound(key_type(value));
1084 template <
typename K,
typename = std::enable_if_t<std::is_arithmetic_v<K>>>
1085 [[nodiscard]] const_iterator upper_bound(K lower, K upper)
const
1087 return upper_bound(key_type(lower, upper));
1094 key_compare key_comp()
const
1097 return key_compare();
1100 value_compare value_comp()
const {
return comp_; }
1106 template <
typename K,
typename M>
1107 friend bool operator==(RangeMap<K, M>
const& lhs, RangeMap<K, M>
const& rhs);
1108 template <
typename K,
typename M>
1109 friend bool operator!=(RangeMap<K, M>
const& lhs, RangeMap<K, M>
const& rhs);
1110 template <
typename K,
typename M>
1111 friend bool operator<(RangeMap<K, M>
const& lhs, RangeMap<K, M>
const& rhs);
1112 template <
typename K,
typename M>
1113 friend bool operator<=(RangeMap<K, M>
const& lhs, RangeMap<K, M>
const& rhs);
1114 template <
typename K,
typename M>
1115 friend bool operator>(RangeMap<K, M>
const& lhs, RangeMap<K, M>
const& rhs);
1116 template <
typename K,
typename M>
1117 friend bool operator>=(RangeMap<K, M>
const& lhs, RangeMap<K, M>
const& rhs);
1119 template <
typename K,
typename M>
1120 friend void swap(RangeMap<K, M>& lhs,
1121 RangeMap<K, M>& rhs)
noexcept(
noexcept(lhs.swap(rhs)));
1123 template <
typename K,
typename M,
class Pred>
1124 friend size_type erase_if(RangeMap<K, M>& range_set, Pred pred);
1126 template <
typename K,
typename M>
1127 friend std::ostream& operator<<(std::ostream& os, RangeMap<K, M>
const& range_map);
1130 static constexpr Key increment(Key value)
1132 if constexpr (std::is_floating_point_v<Key>) {
1133 return std::nextafter(value, std::numeric_limits<Key>::max());
1135 return std::numeric_limits<Key>::max() == value ? std::numeric_limits<Key>::max()
1140 static constexpr Key decrement(Key value)
1142 if constexpr (std::is_floating_point_v<Key>) {
1143 return std::nextafter(value, std::numeric_limits<Key>::lowest());
1145 return std::numeric_limits<Key>::min() == value ? std::numeric_limits<Key>::min()
1151 std::vector<value_type> ranges_;
1152 value_compare comp_;