123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881 |
- #ifndef BASE_UTIL_RANGES_ALGORITHM_H_
- #define BASE_UTIL_RANGES_ALGORITHM_H_
- #include <algorithm>
- #include <utility>
- #include "base/util/ranges/functional.h"
- #include "base/util/ranges/iterator.h"
- namespace util {
- namespace ranges {
- namespace internal {
- template <typename Pred, typename Proj>
- constexpr auto ProjectedUnaryPredicate(Pred& pred, Proj& proj) noexcept {
- return [&pred, &proj](auto&& arg) -> bool {
- return invoke(pred, invoke(proj, std::forward<decltype(arg)>(arg)));
- };
- }
- template <typename Pred, typename Proj1, typename Proj2>
- constexpr auto ProjectedBinaryPredicate(Pred& pred,
- Proj1& proj1,
- Proj2& proj2) noexcept {
- return [&pred, &proj1, &proj2](auto&& lhs, auto&& rhs) -> bool {
- return invoke(pred, invoke(proj1, std::forward<decltype(lhs)>(lhs)),
- invoke(proj2, std::forward<decltype(rhs)>(rhs)));
- };
- }
- }
- template <typename InputIterator, typename Pred, typename Proj = identity>
- constexpr bool all_of(InputIterator first,
- InputIterator last,
- Pred pred,
- Proj proj = {}) {
- return std::all_of(first, last,
- internal::ProjectedUnaryPredicate(pred, proj));
- }
- template <typename Range, typename Pred, typename Proj = identity>
- constexpr bool all_of(Range&& range, Pred pred, Proj proj = {}) {
- return ranges::all_of(ranges::begin(range), ranges::end(range),
- std::move(pred), std::move(proj));
- }
- template <typename InputIterator, typename Pred, typename Proj = identity>
- constexpr bool any_of(InputIterator first,
- InputIterator last,
- Pred pred,
- Proj proj = {}) {
- return std::any_of(first, last,
- internal::ProjectedUnaryPredicate(pred, proj));
- }
- template <typename Range, typename Pred, typename Proj = identity>
- constexpr bool any_of(Range&& range, Pred pred, Proj proj = {}) {
- return ranges::any_of(ranges::begin(range), ranges::end(range),
- std::move(pred), std::move(proj));
- }
- template <typename InputIterator, typename Pred, typename Proj = identity>
- constexpr bool none_of(InputIterator first,
- InputIterator last,
- Pred pred,
- Proj proj = {}) {
- return std::none_of(first, last,
- internal::ProjectedUnaryPredicate(pred, proj));
- }
- template <typename Range, typename Pred, typename Proj = identity>
- constexpr bool none_of(Range&& range, Pred pred, Proj proj = {}) {
- return ranges::none_of(ranges::begin(range), ranges::end(range),
- std::move(pred), std::move(proj));
- }
- template <typename InputIterator, typename Fun, typename Proj = identity>
- constexpr auto for_each(InputIterator first,
- InputIterator last,
- Fun f,
- Proj proj = {}) {
- std::for_each(first, last, [&f, &proj](auto&& arg) {
- return invoke(f, invoke(proj, std::forward<decltype(arg)>(arg)));
- });
- return f;
- }
- template <typename Range, typename Fun, typename Proj = identity>
- constexpr auto for_each(Range&& range, Fun f, Proj proj = {}) {
- return ranges::for_each(ranges::begin(range), ranges::end(range),
- std::move(f), std::move(proj));
- }
- template <typename InputIterator, typename T, typename Proj = identity>
- constexpr auto find(InputIterator first,
- InputIterator last,
- const T& value,
- Proj proj = {}) {
-
-
- return std::find_if(first, last, [&proj, &value](auto&& lhs) {
- return invoke(proj, std::forward<decltype(lhs)>(lhs)) == value;
- });
- }
- template <typename Range, typename T, typename Proj = identity>
- constexpr auto find(Range&& range, const T& value, Proj proj = {}) {
- return ranges::find(ranges::begin(range), ranges::end(range), value,
- std::move(proj));
- }
- template <typename InputIterator, typename Pred, typename Proj = identity>
- constexpr auto find_if(InputIterator first,
- InputIterator last,
- Pred pred,
- Proj proj = {}) {
- return std::find_if(first, last,
- internal::ProjectedUnaryPredicate(pred, proj));
- }
- template <typename Range, typename Pred, typename Proj = identity>
- constexpr auto find_if(Range&& range, Pred pred, Proj proj = {}) {
- return ranges::find_if(ranges::begin(range), ranges::end(range),
- std::move(pred), std::move(proj));
- }
- template <typename InputIterator, typename Pred, typename Proj = identity>
- constexpr auto find_if_not(InputIterator first,
- InputIterator last,
- Pred pred,
- Proj proj = {}) {
- return std::find_if_not(first, last,
- internal::ProjectedUnaryPredicate(pred, proj));
- }
- template <typename Range, typename Pred, typename Proj = identity>
- constexpr auto find_if_not(Range&& range, Pred pred, Proj proj = {}) {
- return ranges::find_if_not(ranges::begin(range), ranges::end(range),
- std::move(pred), std::move(proj));
- }
- template <typename ForwardIterator1,
- typename ForwardIterator2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto find_end(ForwardIterator1 first1,
- ForwardIterator1 last1,
- ForwardIterator2 first2,
- ForwardIterator2 last2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return std::find_end(first1, last1, first2, last2,
- internal::ProjectedBinaryPredicate(pred, proj1, proj2));
- }
- template <typename Range1,
- typename Range2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto find_end(Range1&& range1,
- Range2&& range2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return ranges::find_end(ranges::begin(range1), ranges::end(range1),
- ranges::begin(range2), ranges::end(range2),
- std::move(pred), std::move(proj1), std::move(proj2));
- }
- template <typename ForwardIterator1,
- typename ForwardIterator2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto find_first_of(ForwardIterator1 first1,
- ForwardIterator1 last1,
- ForwardIterator2 first2,
- ForwardIterator2 last2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return std::find_first_of(
- first1, last1, first2, last2,
- internal::ProjectedBinaryPredicate(pred, proj1, proj2));
- }
- template <typename Range1,
- typename Range2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto find_first_of(Range1&& range1,
- Range2&& range2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return ranges::find_first_of(
- ranges::begin(range1), ranges::end(range1), ranges::begin(range2),
- ranges::end(range2), std::move(pred), std::move(proj1), std::move(proj2));
- }
- template <typename ForwardIterator,
- typename Pred = ranges::equal_to,
- typename Proj = identity>
- constexpr auto adjacent_find(ForwardIterator first,
- ForwardIterator last,
- Pred pred = {},
- Proj proj = {}) {
- return std::adjacent_find(
- first, last, internal::ProjectedBinaryPredicate(pred, proj, proj));
- }
- template <typename Range,
- typename Pred = ranges::equal_to,
- typename Proj = identity>
- constexpr auto adjacent_find(Range&& range, Pred pred = {}, Proj proj = {}) {
- return ranges::adjacent_find(ranges::begin(range), ranges::end(range),
- std::move(pred), std::move(proj));
- }
- template <typename InputIterator, typename T, typename Proj = identity>
- constexpr auto count(InputIterator first,
- InputIterator last,
- const T& value,
- Proj proj = {}) {
-
-
- return std::count_if(first, last, [&proj, &value](auto&& lhs) {
- return invoke(proj, std::forward<decltype(lhs)>(lhs)) == value;
- });
- }
- template <typename Range, typename T, typename Proj = identity>
- constexpr auto count(Range&& range, const T& value, Proj proj = {}) {
- return ranges::count(ranges::begin(range), ranges::end(range), value,
- std::move(proj));
- }
- template <typename InputIterator, typename Pred, typename Proj = identity>
- constexpr auto count_if(InputIterator first,
- InputIterator last,
- Pred pred,
- Proj proj = {}) {
- return std::count_if(first, last,
- internal::ProjectedUnaryPredicate(pred, proj));
- }
- template <typename Range, typename Pred, typename Proj = identity>
- constexpr auto count_if(Range&& range, Pred pred, Proj proj = {}) {
- return ranges::count_if(ranges::begin(range), ranges::end(range),
- std::move(pred), std::move(proj));
- }
- template <typename ForwardIterator1,
- typename ForwardIterator2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto mismatch(ForwardIterator1 first1,
- ForwardIterator1 last1,
- ForwardIterator2 first2,
- ForwardIterator2 last2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return std::mismatch(first1, last1, first2, last2,
- internal::ProjectedBinaryPredicate(pred, proj1, proj2));
- }
- template <typename Range1,
- typename Range2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto mismatch(Range1&& range1,
- Range2&& range2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return ranges::mismatch(ranges::begin(range1), ranges::end(range1),
- ranges::begin(range2), ranges::end(range2),
- std::move(pred), std::move(proj1), std::move(proj2));
- }
- template <typename ForwardIterator1,
- typename ForwardIterator2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr bool equal(ForwardIterator1 first1,
- ForwardIterator1 last1,
- ForwardIterator2 first2,
- ForwardIterator2 last2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return std::equal(first1, last1, first2, last2,
- internal::ProjectedBinaryPredicate(pred, proj1, proj2));
- }
- template <typename Range1,
- typename Range2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr bool equal(Range1&& range1,
- Range2&& range2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return ranges::equal(ranges::begin(range1), ranges::end(range1),
- ranges::begin(range2), ranges::end(range2),
- std::move(pred), std::move(proj1), std::move(proj2));
- }
- template <typename ForwardIterator1,
- typename ForwardIterator2,
- typename Pred = ranges::equal_to,
- typename Proj = identity>
- constexpr bool is_permutation(ForwardIterator1 first1,
- ForwardIterator1 last1,
- ForwardIterator2 first2,
- ForwardIterator2 last2,
- Pred pred = {},
- Proj proj = {}) {
- return std::is_permutation(
- first1, last1, first2, last2,
- internal::ProjectedBinaryPredicate(pred, proj, proj));
- }
- template <typename Range1,
- typename Range2,
- typename Pred = ranges::equal_to,
- typename Proj = identity>
- constexpr bool is_permutation(Range1&& range1,
- Range2&& range2,
- Pred pred = {},
- Proj proj = {}) {
- return ranges::is_permutation(ranges::begin(range1), ranges::end(range1),
- ranges::begin(range2), ranges::end(range2),
- std::move(pred), std::move(proj));
- }
- template <typename ForwardIterator1,
- typename ForwardIterator2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto search(ForwardIterator1 first1,
- ForwardIterator1 last1,
- ForwardIterator2 first2,
- ForwardIterator2 last2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return std::search(first1, last1, first2, last2,
- internal::ProjectedBinaryPredicate(pred, proj1, proj2));
- }
- template <typename Range1,
- typename Range2,
- typename Pred = ranges::equal_to,
- typename Proj1 = identity,
- typename Proj2 = identity>
- constexpr auto search(Range1&& range1,
- Range2&& range2,
- Pred pred = {},
- Proj1 proj1 = {},
- Proj2 proj2 = {}) {
- return ranges::search(ranges::begin(range1), ranges::end(range1),
- ranges::begin(range2), ranges::end(range2),
- std::move(pred), std::move(proj1), std::move(proj2));
- }
- template <typename ForwardIterator,
- typename Size,
- typename T,
- typename Pred = ranges::equal_to,
- typename Proj = identity>
- constexpr auto search_n(ForwardIterator first,
- ForwardIterator last,
- Size count,
- const T& value,
- Pred pred = {},
- Proj proj = {}) {
-
-
- identity value_proj;
- return std::search_n(
- first, last, count, value,
- internal::ProjectedBinaryPredicate(pred, proj, value_proj));
- }
- template <typename Range,
- typename Size,
- typename T,
- typename Pred = ranges::equal_to,
- typename Proj = identity>
- constexpr auto search_n(Range&& range,
- Size count,
- const T& value,
- Pred pred = {},
- Proj proj = {}) {
- return ranges::search_n(ranges::begin(range), ranges::end(range), count,
- value, std::move(pred), std::move(proj));
- }
- }
- }
- #endif
|