libbmb
Modern implementation of STL
Loading...
Searching...
No Matches
algo_base.h
Go to the documentation of this file.
1#pragma once
8#include <compare>
9
10#include "utils/compare.h"
11#include "utils/concepts.h"
12#include "utils/iterators.h"
13
14namespace bmb {
15
35template <InputIterator Iter1,
36 InputIterator Iter2, typename Cmp = compare_three_way>
37auto lexicographical_compare_three_way(Iter1 first1, Iter1 last1,
38 Iter2 first2, Iter2 last2,
39 Cmp cmp = Cmp()) {
40 while (first1 != last1
41 && first2 != last2) {
42 if (auto c = cmp(*first1, *first2); c != 0) return c;
43
44 ++first1, ++first2;
45 }
46
47 return first1 != last1 ? std::strong_ordering::greater
48 : first2 != last2 ? std::strong_ordering::less
49 : std::strong_ordering::equal;
50}
51
72template <InputIterator Iter1,
73 InputIterator Iter2, typename Pred = equal_to>
74 requires Predicate<Pred,
75 typename IteratorTraits<Iter1>::reference,
76 typename IteratorTraits<Iter2>::reference>
77bool equal(Iter1 first1, Iter1 last1, Iter2 first2, Pred pred = Pred()) {
78 while (first1 != last1) {
79 if (!pred(*first1, *first2)) return false;
80
81 ++first1, ++first2;
82 }
83 return true;
84}
85
103template <InputIterator Iter1,
104 InputIterator Iter2, typename Pred = equal_to>
105 requires Predicate<Pred,
106 typename IteratorTraits<Iter1>::reference,
107 typename IteratorTraits<Iter2>::reference>
108bool equal(Iter1 first1, Iter1 last1,
109 Iter2 first2, Iter2 last2, Pred pred = Pred()) {
110 while (first1 != last1 && first2 != last2) {
111 if (!pred(*first1, *first2)) return false;
112
113 ++first1, ++first2;
114 }
115
116 return first1 == last1 && first2 == last2;
117}
118
126template <RandomAccessIterator Iter1,
127 RandomAccessIterator Iter2, typename Pred = equal_to>
128 requires Predicate<Pred,
129 typename IteratorTraits<Iter1>::reference,
130 typename IteratorTraits<Iter2>::reference>
131bool equal(Iter1 first1, Iter1 last1,
132 Iter2 first2, Iter2 last2, Pred pred = Pred()) {
133 if (last1 - first1 != last2 - first2) return false;
134
135 while (first1 != last1 && first2 != last2) {
136 if (!pred(*first1, *first2)) return false;
137
138 ++first1, ++first2;
139 }
140
141 return true;
142}
143} // namespace bmb
InputIterator.
Definition iterators.h:70
Definition algo_base.h:14
bool equal(Iter1 first1, Iter1 last1, Iter2 first2, Pred pred=Pred())
Checks whether given ranges are equal.
Definition algo_base.h:77
auto lexicographical_compare_three_way(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2, Cmp cmp=Cmp())
Compares ranges lexicographically using C++20 three-way comparation.
Definition algo_base.h:37
compare_three_way
Definition compare.h:12