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 Pred>
91internal_algorithm::ContainerIter<C>
FindIf(C& c, Pred&& pred) {
92 return std::find_if(std::begin(c), std::end(c), std::forward<Pred>(pred));
97template <
typename C,
typename Pred>
98internal_algorithm::ContainerIter<C>
FindIfNot(C& c, Pred&& pred) {
99 return std::find_if_not(std::begin(c), std::end(c), std::forward<Pred>(pred));
104template <
typename Sequence1,
typename Sequence2>
105internal_algorithm::ContainerIter<Sequence1>
FindEnd(Sequence1& sequence,
106 Sequence2& subsequence) {
107 return std::find_end(std::begin(sequence),
109 std::begin(subsequence),
110 std::end(subsequence));
115template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
116internal_algorithm::ContainerIter<Sequence1>
FindEnd(Sequence1& sequence,
117 Sequence2& subsequence,
118 BinaryPredicate&& pred) {
119 return std::find_end(std::begin(sequence),
121 std::begin(subsequence),
122 std::end(subsequence),
123 std::forward<BinaryPredicate>(pred));
129template <
typename C1,
typename C2>
130internal_algorithm::ContainerIter<C1>
FindFirstOf(C1& container, C2& options) {
131 return std::find_first_of(std::begin(container),
139template <
typename C1,
typename C2,
typename BinaryPredicate>
142 BinaryPredicate&& pred) {
143 return std::find_first_of(std::begin(container),
147 std::forward<BinaryPredicate>(pred));
152template <
typename Sequence>
153internal_algorithm::ContainerIter<Sequence>
AdjacentFind(Sequence& sequence) {
154 return std::adjacent_find(std::begin(sequence), std::end(sequence));
159template <
typename Sequence,
typename BinaryPredicate>
161 Sequence& sequence, BinaryPredicate&& pred) {
162 return std::adjacent_find(std::begin(sequence),
164 std::forward<BinaryPredicate>(pred));
169template <
typename C,
typename T>
170internal_algorithm::ContainerDifferenceType<const C>
Count(
const C& c,
172 return std::count(std::begin(c), std::end(c), std::forward<T>(value));
177template <
typename C,
typename Pred>
178internal_algorithm::ContainerDifferenceType<const C>
CountIf(
const C& c,
180 return std::count_if(std::begin(c), std::end(c), std::forward<Pred>(pred));
186template <
typename C1,
typename C2>
187internal_algorithm::ContainerIterPairType<C1, C2>
Mismatch(C1& c1, C2& c2) {
188 auto first1 = std::begin(c1);
189 auto last1 = std::end(c1);
190 auto first2 = std::begin(c2);
191 auto last2 = std::end(c2);
193 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
196 if (!(*first1 == *first2)) {
201 return std::make_pair(first1, first2);
207template <
typename C1,
typename C2,
typename BinaryPredicate>
208internal_algorithm::ContainerIterPairType<C1, C2>
Mismatch(
209 C1& c1, C2& c2, BinaryPredicate pred) {
210 auto first1 = std::begin(c1);
211 auto last1 = std::end(c1);
212 auto first2 = std::begin(c2);
213 auto last2 = std::end(c2);
215 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
216 if (!pred(*first1, *first2)) {
221 return std::make_pair(first1, first2);
240template <
typename C1,
typename C2>
241bool Equal(
const C1& c1,
const C2& c2) {
242 return ((std::size(c1) == std::size(c2)) &&
243 std::equal(std::begin(c1), std::end(c1), std::begin(c2)));
248template <
typename C1,
typename C2,
typename BinaryPredicate>
249bool Equal(
const C1& c1,
const C2& c2, BinaryPredicate&& pred) {
250 return ((std::size(c1) == std::size(c2)) &&
251 std::equal(std::begin(c1),
254 std::forward<BinaryPredicate>(pred)));
259template <
typename C1,
typename C2>
263 return c1.size() == c2.size() &&
264 std::is_permutation(begin(c1), end(c1), begin(c2));
269template <
typename C1,
typename C2,
typename BinaryPredicate>
273 return c1.size() == c2.size() &&
274 std::is_permutation(begin(c1),
277 std::forward<BinaryPredicate>(pred));
282template <
typename Sequence1,
typename Sequence2>
283internal_algorithm::ContainerIter<Sequence1>
Search(Sequence1& sequence,
284 Sequence2& subsequence) {
285 return std::search(std::begin(sequence),
287 std::begin(subsequence),
288 std::end(subsequence));
293template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
294internal_algorithm::ContainerIter<Sequence1>
Search(Sequence1& sequence,
295 Sequence2& subsequence,
296 BinaryPredicate&& pred) {
297 return std::search(std::begin(sequence),
299 std::begin(subsequence),
300 std::end(subsequence),
301 std::forward<BinaryPredicate>(pred));
306template <
typename Sequence,
typename Size,
typename T>
307internal_algorithm::ContainerIter<Sequence>
SearchN(Sequence& sequence,
310 return std::search_n(
311 std::begin(sequence), std::end(sequence), count, std::forward<T>(value));
316template <
typename Sequence,
319 typename BinaryPredicate>
320internal_algorithm::ContainerIter<Sequence>
SearchN(Sequence& sequence,
323 BinaryPredicate&& pred) {
324 return std::search_n(std::begin(sequence),
327 std::forward<T>(value),
328 std::forward<BinaryPredicate>(pred));
333#if defined(__cpp_lib_constexpr_algorithms)
345template <
typename InputIt,
typename Predicate>
346constexpr bool all_of(InputIt first, InputIt last, Predicate pred) {
347 for (; first != last; ++first) {
356template <
typename InputIt,
typename Predicate>
357constexpr bool any_of(InputIt first, InputIt last, Predicate pred) {
358 for (; first != last; ++first) {
367template <
typename InputIt,
typename Predicate>
368constexpr InputIt
find_if(InputIt first, InputIt last, Predicate pred) {
369 for (; first != last; ++first) {
378template <
typename ForwardIt,
typename T>
379constexpr void fill(ForwardIt begin, ForwardIt end,
const T& value) {
380 for (; begin != end; ++begin) {
386template <
typename It,
typename Size,
typename T>
387constexpr It
fill_n(It begin, Size count,
const T& value) {
388 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:98
internal_algorithm::ContainerIter< Sequence > SearchN(Sequence &sequence, Size count, T &&value)
Definition: algorithm.h:307
internal_algorithm::ContainerIter< C > Find(C &c, T &&value)
Definition: algorithm.h:84
bool Equal(const C1 &c1, const C2 &c2)
Definition: algorithm.h:241
internal_algorithm::ContainerIter< Sequence1 > Search(Sequence1 &sequence, Sequence2 &subsequence)
Definition: algorithm.h:283
internal_algorithm::ContainerIter< Sequence > AdjacentFind(Sequence &sequence)
Definition: algorithm.h:153
internal_algorithm::ContainerIter< Sequence1 > FindEnd(Sequence1 &sequence, Sequence2 &subsequence)
Definition: algorithm.h:105
constexpr InputIt find_if(InputIt first, InputIt last, Predicate pred)
constexpr backport of <algorithm>'s std::find_if for C++17.
Definition: algorithm.h:368
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:387
constexpr bool all_of(InputIt first, InputIt last, Predicate pred)
constexpr backport of <algorithm>'s std::all_of for C++17.
Definition: algorithm.h:346
internal_algorithm::ContainerDifferenceType< const C > CountIf(const C &c, Pred &&pred)
Definition: algorithm.h:178
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:260
internal_algorithm::ContainerIter< C > FindIf(C &c, Pred &&pred)
Definition: algorithm.h:91
internal_algorithm::ContainerIterPairType< C1, C2 > Mismatch(C1 &c1, C2 &c2)
Definition: algorithm.h:187
constexpr void fill(ForwardIt begin, ForwardIt end, const T &value)
constexpr backport of <algorithm>'s std::fill for C++17.
Definition: algorithm.h:379
bool NoneOf(const C &c, Pred &&pred)
Definition: algorithm.h:70
internal_algorithm::ContainerIter< C1 > FindFirstOf(C1 &container, C2 &options)
Definition: algorithm.h:130
constexpr bool any_of(InputIt first, InputIt last, Predicate pred)
constexpr backport of <algorithm>'s std::any_of for C++17.
Definition: algorithm.h:357
internal_algorithm::ContainerDifferenceType< const C > Count(const C &c, T &&value)
Definition: algorithm.h:170
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