22#include "pw_containers/internal/algorithm_internal.h"
55template <
typename C,
typename Pred>
56bool AllOf(
const C& c, Pred&& pred) {
57 return std::all_of(std::begin(c), std::end(c), std::forward<Pred>(pred));
62template <
typename C,
typename Pred>
63bool AnyOf(
const C& c, Pred&& pred) {
64 return std::any_of(std::begin(c), std::end(c), std::forward<Pred>(pred));
69template <
typename C,
typename Pred>
70bool NoneOf(
const C& c, Pred&& pred) {
71 return std::none_of(std::begin(c), std::end(c), std::forward<Pred>(pred));
76template <
typename C,
typename Function>
78 return std::for_each(std::begin(c), std::end(c), std::forward<Function>(f));
83template <
typename C,
typename T>
84internal_algorithm::ContainerIter<C>
Find(C& c, T&& value) {
85 return std::find(std::begin(c), std::end(c), std::forward<T>(value));
90template <
typename C,
typename T>
91bool Contains(
const C& c, T&& value) {
92 return Find(c, std::forward<T>(value)) != std::end(c);
97template <
typename C,
typename Pred>
98internal_algorithm::ContainerIter<C>
FindIf(C& c, Pred&& pred) {
99 return std::find_if(std::begin(c), std::end(c), std::forward<Pred>(pred));
104template <
typename C,
typename Pred>
105internal_algorithm::ContainerIter<C>
FindIfNot(C& c, Pred&& pred) {
106 return std::find_if_not(std::begin(c), std::end(c), std::forward<Pred>(pred));
111template <
typename Sequence1,
typename Sequence2>
112internal_algorithm::ContainerIter<Sequence1>
FindEnd(Sequence1& sequence,
113 Sequence2& subsequence) {
114 return std::find_end(std::begin(sequence),
116 std::begin(subsequence),
117 std::end(subsequence));
122template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
123internal_algorithm::ContainerIter<Sequence1>
FindEnd(Sequence1& sequence,
124 Sequence2& subsequence,
125 BinaryPredicate&& pred) {
126 return std::find_end(std::begin(sequence),
128 std::begin(subsequence),
129 std::end(subsequence),
130 std::forward<BinaryPredicate>(pred));
136template <
typename C1,
typename C2>
137internal_algorithm::ContainerIter<C1>
FindFirstOf(C1& container, C2& options) {
138 return std::find_first_of(std::begin(container),
146template <
typename C1,
typename C2,
typename BinaryPredicate>
149 BinaryPredicate&& pred) {
150 return std::find_first_of(std::begin(container),
154 std::forward<BinaryPredicate>(pred));
159template <
typename Sequence>
160internal_algorithm::ContainerIter<Sequence>
AdjacentFind(Sequence& sequence) {
161 return std::adjacent_find(std::begin(sequence), std::end(sequence));
166template <
typename Sequence,
typename BinaryPredicate>
168 Sequence& sequence, BinaryPredicate&& pred) {
169 return std::adjacent_find(std::begin(sequence),
171 std::forward<BinaryPredicate>(pred));
176template <
typename C,
typename T>
177internal_algorithm::ContainerDifferenceType<const C>
Count(
const C& c,
179 return std::count(std::begin(c), std::end(c), std::forward<T>(value));
184template <
typename C,
typename Pred>
185internal_algorithm::ContainerDifferenceType<const C>
CountIf(
const C& c,
187 return std::count_if(std::begin(c), std::end(c), std::forward<Pred>(pred));
193template <
typename C1,
typename C2>
194internal_algorithm::ContainerIterPairType<C1, C2>
Mismatch(C1& c1, C2& c2) {
195 auto first1 = std::begin(c1);
196 auto last1 = std::end(c1);
197 auto first2 = std::begin(c2);
198 auto last2 = std::end(c2);
200 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
203 if (!(*first1 == *first2)) {
208 return std::make_pair(first1, first2);
214template <
typename C1,
typename C2,
typename BinaryPredicate>
215internal_algorithm::ContainerIterPairType<C1, C2>
Mismatch(
216 C1& c1, C2& c2, BinaryPredicate pred) {
217 auto first1 = std::begin(c1);
218 auto last1 = std::end(c1);
219 auto first2 = std::begin(c2);
220 auto last2 = std::end(c2);
222 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
223 if (!pred(*first1, *first2)) {
228 return std::make_pair(first1, first2);
247template <
typename C1,
typename C2>
248bool Equal(
const C1& c1,
const C2& c2) {
249 return ((std::size(c1) == std::size(c2)) &&
250 std::equal(std::begin(c1), std::end(c1), std::begin(c2)));
255template <
typename C1,
typename C2,
typename BinaryPredicate>
256bool Equal(
const C1& c1,
const C2& c2, BinaryPredicate&& pred) {
257 return ((std::size(c1) == std::size(c2)) &&
258 std::equal(std::begin(c1),
261 std::forward<BinaryPredicate>(pred)));
266template <
typename C1,
typename C2>
270 return c1.size() == c2.size() &&
271 std::is_permutation(begin(c1), end(c1), begin(c2));
276template <
typename C1,
typename C2,
typename BinaryPredicate>
280 return c1.size() == c2.size() &&
281 std::is_permutation(begin(c1),
284 std::forward<BinaryPredicate>(pred));
289template <
typename Sequence1,
typename Sequence2>
290internal_algorithm::ContainerIter<Sequence1>
Search(Sequence1& sequence,
291 Sequence2& subsequence) {
292 return std::search(std::begin(sequence),
294 std::begin(subsequence),
295 std::end(subsequence));
300template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
301internal_algorithm::ContainerIter<Sequence1>
Search(Sequence1& sequence,
302 Sequence2& subsequence,
303 BinaryPredicate&& pred) {
304 return std::search(std::begin(sequence),
306 std::begin(subsequence),
307 std::end(subsequence),
308 std::forward<BinaryPredicate>(pred));
313template <
typename Sequence,
typename Size,
typename T>
314internal_algorithm::ContainerIter<Sequence>
SearchN(Sequence& sequence,
317 return std::search_n(
318 std::begin(sequence), std::end(sequence), count, std::forward<T>(value));
323template <
typename Sequence,
326 typename BinaryPredicate>
327internal_algorithm::ContainerIter<Sequence>
SearchN(Sequence& sequence,
330 BinaryPredicate&& pred) {
331 return std::search_n(std::begin(sequence),
334 std::forward<T>(value),
335 std::forward<BinaryPredicate>(pred));
340#if defined(__cpp_lib_constexpr_algorithms)
354template <
typename InputIt,
typename OutputIt>
355constexpr OutputIt
copy(InputIt first, InputIt last, OutputIt d_first) {
356 while (first != last) {
357 *d_first++ = *first++;
363template <
typename InputIt,
typename OutputIt,
typename UnaryPredicate>
367 UnaryPredicate pred) {
368 while (first != last) {
378template <
typename InputIt,
typename Predicate>
379constexpr bool all_of(InputIt first, InputIt last, Predicate pred) {
380 for (; first != last; ++first) {
389template <
typename InputIt,
typename Predicate>
390constexpr bool any_of(InputIt first, InputIt last, Predicate pred) {
391 for (; first != last; ++first) {
400template <
typename InputIt,
typename Predicate>
401constexpr InputIt
find_if(InputIt first, InputIt last, Predicate pred) {
402 for (; first != last; ++first) {
411template <
typename ForwardIt,
typename T>
412constexpr void fill(ForwardIt begin, ForwardIt end,
const T& value) {
413 for (; begin != end; ++begin) {
419template <
typename It,
typename Size,
typename T>
420constexpr It
fill_n(It begin, Size count,
const T& value) {
421 for (Size i = 0; i < count; ++i) {
std::decay_t< Function > ForEach(C &&c, Function &&f)
Definition: algorithm.h:77
internal_algorithm::ContainerIter< C > FindIfNot(C &c, Pred &&pred)
Definition: algorithm.h:105
internal_algorithm::ContainerIter< Sequence > SearchN(Sequence &sequence, Size count, T &&value)
Definition: algorithm.h:314
internal_algorithm::ContainerIter< C > Find(C &c, T &&value)
Definition: algorithm.h:84
bool Equal(const C1 &c1, const C2 &c2)
Definition: algorithm.h:248
internal_algorithm::ContainerIter< Sequence1 > Search(Sequence1 &sequence, Sequence2 &subsequence)
Definition: algorithm.h:290
internal_algorithm::ContainerIter< Sequence > AdjacentFind(Sequence &sequence)
Definition: algorithm.h:160
internal_algorithm::ContainerIter< Sequence1 > FindEnd(Sequence1 &sequence, Sequence2 &subsequence)
Definition: algorithm.h:112
constexpr InputIt find_if(InputIt first, InputIt last, Predicate pred)
constexpr backport of <algorithm>'s std::find_if for C++17.
Definition: algorithm.h:401
constexpr It fill_n(It begin, Size count, const T &value)
constexpr backport of <algorithm>'s std::fill_n for C++17.
Definition: algorithm.h:420
constexpr OutputIt copy(InputIt first, InputIt last, OutputIt d_first)
constexpr backport of <algorithm>'s std::copy for C++17.
Definition: algorithm.h:355
constexpr bool all_of(InputIt first, InputIt last, Predicate pred)
constexpr backport of <algorithm>'s std::all_of for C++17.
Definition: algorithm.h:379
internal_algorithm::ContainerDifferenceType< const C > CountIf(const C &c, Pred &&pred)
Definition: algorithm.h:185
bool AllOf(const C &c, Pred &&pred)
Definition: algorithm.h:56
bool AnyOf(const C &c, Pred &&pred)
Definition: algorithm.h:63
bool IsPermutation(const C1 &c1, const C2 &c2)
Definition: algorithm.h:267
internal_algorithm::ContainerIter< C > FindIf(C &c, Pred &&pred)
Definition: algorithm.h:98
internal_algorithm::ContainerIterPairType< C1, C2 > Mismatch(C1 &c1, C2 &c2)
Definition: algorithm.h:194
constexpr void fill(ForwardIt begin, ForwardIt end, const T &value)
constexpr backport of <algorithm>'s std::fill for C++17.
Definition: algorithm.h:412
bool NoneOf(const C &c, Pred &&pred)
Definition: algorithm.h:70
internal_algorithm::ContainerIter< C1 > FindFirstOf(C1 &container, C2 &options)
Definition: algorithm.h:137
constexpr bool any_of(InputIt first, InputIt last, Predicate pred)
constexpr backport of <algorithm>'s std::any_of for C++17.
Definition: algorithm.h:390
constexpr OutputIt copy_if(InputIt first, InputIt last, OutputIt d_first, UnaryPredicate pred)
constexpr backport of <algorithm>'s std::copy_if for C++17.
Definition: algorithm.h:364
internal_algorithm::ContainerDifferenceType< const C > Count(const C &c, T &&value)
Definition: algorithm.h:177
fit::function_impl< function_internal::config::kInlineCallableSize, !function_internal::config::kEnableDynamicAllocation, FunctionType, PW_FUNCTION_DEFAULT_ALLOCATOR_TYPE > Function
Definition: function.h:73
The Pigweed namespace.
Definition: alignment.h:27