22#include "pw_containers/internal/algorithm_internal.h"
50template <
typename C,
typename Pred>
51bool AllOf(
const C& c, Pred&& pred) {
52 return std::all_of(std::begin(c), std::end(c), std::forward<Pred>(pred));
57template <
typename C,
typename Pred>
58bool AnyOf(
const C& c, Pred&& pred) {
59 return std::any_of(std::begin(c), std::end(c), std::forward<Pred>(pred));
64template <
typename C,
typename Pred>
65bool NoneOf(
const C& c, Pred&& pred) {
66 return std::none_of(std::begin(c), std::end(c), std::forward<Pred>(pred));
71template <
typename C,
typename Function>
73 return std::for_each(std::begin(c), std::end(c), std::forward<Function>(f));
78template <
typename C,
typename T>
79internal_algorithm::ContainerIter<C>
Find(C& c, T&& value) {
80 return std::find(std::begin(c), std::end(c), std::forward<T>(value));
85template <
typename C,
typename Pred>
86internal_algorithm::ContainerIter<C>
FindIf(C& c, Pred&& pred) {
87 return std::find_if(std::begin(c), std::end(c), std::forward<Pred>(pred));
92template <
typename C,
typename Pred>
93internal_algorithm::ContainerIter<C>
FindIfNot(C& c, Pred&& pred) {
94 return std::find_if_not(std::begin(c), std::end(c), std::forward<Pred>(pred));
99template <
typename Sequence1,
typename Sequence2>
100internal_algorithm::ContainerIter<Sequence1>
FindEnd(Sequence1& sequence,
101 Sequence2& subsequence) {
102 return std::find_end(std::begin(sequence),
104 std::begin(subsequence),
105 std::end(subsequence));
110template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
111internal_algorithm::ContainerIter<Sequence1>
FindEnd(Sequence1& sequence,
112 Sequence2& subsequence,
113 BinaryPredicate&& pred) {
114 return std::find_end(std::begin(sequence),
116 std::begin(subsequence),
117 std::end(subsequence),
118 std::forward<BinaryPredicate>(pred));
124template <
typename C1,
typename C2>
125internal_algorithm::ContainerIter<C1>
FindFirstOf(C1& container, C2& options) {
126 return std::find_first_of(std::begin(container),
134template <
typename C1,
typename C2,
typename BinaryPredicate>
137 BinaryPredicate&& pred) {
138 return std::find_first_of(std::begin(container),
142 std::forward<BinaryPredicate>(pred));
147template <
typename Sequence>
148internal_algorithm::ContainerIter<Sequence>
AdjacentFind(Sequence& sequence) {
149 return std::adjacent_find(std::begin(sequence), std::end(sequence));
154template <
typename Sequence,
typename BinaryPredicate>
156 Sequence& sequence, BinaryPredicate&& pred) {
157 return std::adjacent_find(std::begin(sequence),
159 std::forward<BinaryPredicate>(pred));
164template <
typename C,
typename T>
165internal_algorithm::ContainerDifferenceType<const C>
Count(
const C& c,
167 return std::count(std::begin(c), std::end(c), std::forward<T>(value));
172template <
typename C,
typename Pred>
173internal_algorithm::ContainerDifferenceType<const C>
CountIf(
const C& c,
175 return std::count_if(std::begin(c), std::end(c), std::forward<Pred>(pred));
181template <
typename C1,
typename C2>
182internal_algorithm::ContainerIterPairType<C1, C2>
Mismatch(C1& c1, C2& c2) {
183 auto first1 = std::begin(c1);
184 auto last1 = std::end(c1);
185 auto first2 = std::begin(c2);
186 auto last2 = std::end(c2);
188 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
191 if (!(*first1 == *first2)) {
196 return std::make_pair(first1, first2);
202template <
typename C1,
typename C2,
typename BinaryPredicate>
203internal_algorithm::ContainerIterPairType<C1, C2>
Mismatch(
204 C1& c1, C2& c2, BinaryPredicate pred) {
205 auto first1 = std::begin(c1);
206 auto last1 = std::end(c1);
207 auto first2 = std::begin(c2);
208 auto last2 = std::end(c2);
210 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
211 if (!pred(*first1, *first2)) {
216 return std::make_pair(first1, first2);
235template <
typename C1,
typename C2>
236bool Equal(
const C1& c1,
const C2& c2) {
237 return ((std::size(c1) == std::size(c2)) &&
238 std::equal(std::begin(c1), std::end(c1), std::begin(c2)));
243template <
typename C1,
typename C2,
typename BinaryPredicate>
244bool Equal(
const C1& c1,
const C2& c2, BinaryPredicate&& pred) {
245 return ((std::size(c1) == std::size(c2)) &&
246 std::equal(std::begin(c1),
249 std::forward<BinaryPredicate>(pred)));
254template <
typename C1,
typename C2>
258 return c1.size() == c2.size() &&
259 std::is_permutation(begin(c1), end(c1), begin(c2));
264template <
typename C1,
typename C2,
typename BinaryPredicate>
268 return c1.size() == c2.size() &&
269 std::is_permutation(begin(c1),
272 std::forward<BinaryPredicate>(pred));
277template <
typename Sequence1,
typename Sequence2>
278internal_algorithm::ContainerIter<Sequence1>
Search(Sequence1& sequence,
279 Sequence2& subsequence) {
280 return std::search(std::begin(sequence),
282 std::begin(subsequence),
283 std::end(subsequence));
288template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
289internal_algorithm::ContainerIter<Sequence1>
Search(Sequence1& sequence,
290 Sequence2& subsequence,
291 BinaryPredicate&& pred) {
292 return std::search(std::begin(sequence),
294 std::begin(subsequence),
295 std::end(subsequence),
296 std::forward<BinaryPredicate>(pred));
301template <
typename Sequence,
typename Size,
typename T>
302internal_algorithm::ContainerIter<Sequence>
SearchN(Sequence& sequence,
305 return std::search_n(
306 std::begin(sequence), std::end(sequence), count, std::forward<T>(value));
311template <
typename Sequence,
314 typename BinaryPredicate>
315internal_algorithm::ContainerIter<Sequence>
SearchN(Sequence& sequence,
318 BinaryPredicate&& pred) {
319 return std::search_n(std::begin(sequence),
322 std::forward<T>(value),
323 std::forward<BinaryPredicate>(pred));
fit::function_impl< function_internal::config::kInlineCallableSize, !function_internal::config::kEnableDynamicAllocation, FunctionType, PW_FUNCTION_DEFAULT_ALLOCATOR_TYPE > Function
Definition: function.h:74
Definition: algorithm.h:46
std::decay_t< Function > ForEach(C &&c, Function &&f)
Definition: algorithm.h:72
internal_algorithm::ContainerIter< C > FindIfNot(C &c, Pred &&pred)
Definition: algorithm.h:93
internal_algorithm::ContainerIter< Sequence > SearchN(Sequence &sequence, Size count, T &&value)
Definition: algorithm.h:302
internal_algorithm::ContainerIter< C > Find(C &c, T &&value)
Definition: algorithm.h:79
bool Equal(const C1 &c1, const C2 &c2)
Definition: algorithm.h:236
internal_algorithm::ContainerIter< Sequence1 > Search(Sequence1 &sequence, Sequence2 &subsequence)
Definition: algorithm.h:278
internal_algorithm::ContainerIter< Sequence > AdjacentFind(Sequence &sequence)
Definition: algorithm.h:148
internal_algorithm::ContainerIter< Sequence1 > FindEnd(Sequence1 &sequence, Sequence2 &subsequence)
Definition: algorithm.h:100
internal_algorithm::ContainerDifferenceType< const C > CountIf(const C &c, Pred &&pred)
Definition: algorithm.h:173
bool AllOf(const C &c, Pred &&pred)
Definition: algorithm.h:51
bool AnyOf(const C &c, Pred &&pred)
Definition: algorithm.h:58
bool IsPermutation(const C1 &c1, const C2 &c2)
Definition: algorithm.h:255
internal_algorithm::ContainerIter< C > FindIf(C &c, Pred &&pred)
Definition: algorithm.h:86
internal_algorithm::ContainerIterPairType< C1, C2 > Mismatch(C1 &c1, C2 &c2)
Definition: algorithm.h:182
bool NoneOf(const C &c, Pred &&pred)
Definition: algorithm.h:65
internal_algorithm::ContainerIter< C1 > FindFirstOf(C1 &container, C2 &options)
Definition: algorithm.h:125
internal_algorithm::ContainerDifferenceType< const C > Count(const C &c, T &&value)
Definition: algorithm.h:165