@@ -26,7 +26,9 @@ requires std::equality_comparable_with<El, std::ranges::range_value_t<Range>>
26
26
bool
27
27
contains (Range const & range, El const & el)
28
28
{
29
- return std::find (range.begin (), range.end (), el) != range.end ();
29
+ return std::find (
30
+ std::ranges::begin (range),
31
+ std::ranges::end (range), el) != std::ranges::end (range);
30
32
}
31
33
32
34
// A second overload where the range is an initializer list
@@ -41,7 +43,9 @@ requires std::equality_comparable_with<T, U>
41
43
bool
42
44
contains (std::initializer_list<T> const & range, U const & el)
43
45
{
44
- return std::find (range.begin (), range.end (), el) != range.end ();
46
+ return std::find (
47
+ std::ranges::begin (range),
48
+ std::ranges::end (range), el) != std::ranges::end (range);
45
49
}
46
50
47
51
/* * Determine if a range contains any of the specified elements.
@@ -54,15 +58,16 @@ requires std::equality_comparable_with<std::ranges::range_value_t<Els>, std::ran
54
58
bool
55
59
contains_any (Range const & range, Els const & els)
56
60
{
57
- return std::ranges::find_first_of (range, els) != range. end ();
61
+ return std::ranges::find_first_of (range, els) != std::ranges:: end (range );
58
62
}
59
63
64
+ // / @copydoc contains_any(Range const&, Els const&)
60
65
template <std::ranges::range Range, class El >
61
66
requires std::equality_comparable_with<El, std::ranges::range_value_t <Range>>
62
67
bool
63
68
contains_any (Range const & range, std::initializer_list<El> const & els)
64
69
{
65
- return std::ranges::find_first_of (range, els) != range. end ();
70
+ return std::ranges::find_first_of (range, els) != std::ranges:: end (range );
66
71
}
67
72
68
73
/* * Determine if a range contains at least N instances of the specified element.
@@ -90,10 +95,55 @@ contains_n(Range const& range, El const& el, std::size_t n)
90
95
return false ;
91
96
}
92
97
98
+ /* * Determine if a range contains at least N instances of any of the specified elements.
99
+ @param range The range to search.
100
+ @param els The elements to search for.
101
+ @param n The number of instances to search for.
102
+ @return True if the element is found, false otherwise.
103
+ */
104
+ template <std::ranges::range Range, std::ranges::range Els>
105
+ requires std::equality_comparable_with<std::ranges::range_value_t <Els>, std::ranges::range_value_t <Range>>
106
+ bool
107
+ contains_n_any (Range const & range, Els const & els, std::size_t n)
108
+ {
109
+ for (auto const & item : range)
110
+ {
111
+ if (contains (els, item))
112
+ {
113
+ --n;
114
+ if (n == 0 )
115
+ {
116
+ return true ;
117
+ }
118
+ }
119
+ }
120
+ return false ;
121
+ }
122
+
123
+ // / @copydoc contains_n_any(Range const&, Els const&, std::size_t)
124
+ template <std::ranges::range Range, class El >
125
+ requires std::equality_comparable_with<El, std::ranges::range_value_t <Range>>
126
+ bool
127
+ contains_n_any (Range const & range, std::initializer_list<El> const & els, std::size_t n)
128
+ {
129
+ for (auto const & item : range)
130
+ {
131
+ if (contains (els, item))
132
+ {
133
+ --n;
134
+ if (n == 0 )
135
+ {
136
+ return true ;
137
+ }
138
+ }
139
+ }
140
+ return false ;
141
+ }
142
+
93
143
/* * Find the last element in a range that matches an element in the specified range.
94
144
@param range The range to search.
95
145
@param els The elements to search for.
96
- @return An iterator to the last element found, or range. end() if not found.
146
+ @return An iterator to the last element found, or std::ranges:: end(range ) if not found.
97
147
*/
98
148
template <std::ranges::range Range, std::ranges::range Els>
99
149
requires std::equality_comparable_with<std::ranges::range_value_t <Els>, std::ranges::range_value_t <Range>>
0 commit comments