130#if defined(ALEPH_NO_RANGES)
131#undef ALEPH_HAS_RANGES
132#define ALEPH_HAS_RANGES 0
139#if __has_include(<version>)
143#ifndef ALEPH_HAS_RANGES
144#if __cplusplus >= 202002L && __has_include(<ranges>) && \
145 defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 202106L
147#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 160000
148#define ALEPH_HAS_RANGES 0
150#define ALEPH_HAS_RANGES 1
153#define ALEPH_HAS_RANGES 0
168#ifdef __cpp_lib_ranges_stride
169#define ALEPH_HAS_STRIDE 1
171#define ALEPH_HAS_STRIDE 0
174#ifdef __cpp_lib_ranges_repeat
175#define ALEPH_HAS_REPEAT 1
177#define ALEPH_HAS_REPEAT 0
180#ifdef __cpp_lib_ranges_zip
181#define ALEPH_HAS_ZIP 1
183#define ALEPH_HAS_ZIP 0
186#ifdef __cpp_lib_ranges_enumerate
187#define ALEPH_HAS_ENUMERATE 1
189#define ALEPH_HAS_ENUMERATE 0
198#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 170000
199#define ALEPH_HAS_JOIN 0
201#define ALEPH_HAS_JOIN 1
204#include <type_traits>
226template <
typename Range,
typename Cmp>
230 std::ranges::sort(
r, std::move(
cmp));
234 std::sort(std::begin(
r), std::end(
r), std::move(
cmp));
242template <
typename Range>
246 std::ranges::sort(
r, std::ranges::less{});
250 std::sort(std::begin(
r), std::end(
r));
290 typename C::Iterator;
291 typename C::Item_Type;
292 { c.begin() } -> std::input_or_output_iterator;
293 { c.end() } -> std::sentinel_for<
decltype(c.begin())>;
307concept RangeLike = std::ranges::range<R>;
330template <AlephAppendable Container, RangeLike R>
334 for (
auto &&
elem :
r)
367template <
typename T =
int>
370 return std::views::iota(start, end);
379template <
typename T =
int>
382 return std::views::iota(
T{0}, n);
400template <
typename T =
int>
403 return std::views::iota(start);
417 return std::views::repeat(
value) | std::views::take(n);
432template <RangeLike R,
typename Pred>
435 return std::ranges::all_of(std::forward<R>(
r), std::forward<Pred>(
pred));
443template <RangeLike R,
typename Pred>
446 return std::ranges::any_of(std::forward<R>(
r), std::forward<Pred>(
pred));
454template <RangeLike R,
typename Pred>
457 return std::ranges::none_of(std::forward<R>(
r), std::forward<Pred>(
pred));
465template <RangeLike R,
typename Pred>
468 return std::ranges::find_if(std::forward<R>(
r), std::forward<Pred>(
pred));
474template <RangeLike R,
typename Pred>
477 return std::ranges::count_if(std::forward<R>(
r), std::forward<Pred>(
pred));
485template <RangeLike R,
typename Func>
488 return std::forward<R>(
r) | std::views::transform(std::forward<Func>(func));
496template <RangeLike R,
typename Pred>
499 return std::forward<R>(
r) | std::views::filter(std::forward<Pred>(
pred));
505template <RangeLike R>
508 return std::forward<R>(
r) | std::views::take(n);
514template <RangeLike R>
517 return std::forward<R>(
r) | std::views::drop(n);
525template <RangeLike R>
526 requires std::ranges::bidirectional_range<R>
529 return std::forward<R>(
r) | std::views::reverse;
536template <RangeLike R>
539 return std::forward<R>(
r) | std::views::join;
550 return std::views::zip(std::forward<Rs>(
rs)...);
554#if ALEPH_HAS_ENUMERATE
558template <RangeLike R>
561 return std::forward<R>(
r) | std::views::enumerate;
570template <RangeLike R,
typename T,
typename BinaryOp>
573#ifdef __cpp_lib_ranges_fold
574 return std::ranges::fold_left(std::forward<R>(
r),
init, std::forward<BinaryOp>(op));
577 for (
auto &&
elem :
r)
586template <RangeLike R>
589 using T = std::ranges::range_value_t<R>;
596template <RangeLike R>
599 using T = std::ranges::range_value_t<R>;
606template <RangeLike R>
609 return std::ranges::min_element(std::forward<R>(
r));
615template <RangeLike R>
618 return std::ranges::max_element(std::forward<R>(
r));
624template <RangeLike R,
typename Comp = std::less<>>
627 std::ranges::sort(std::forward<R>(
r), std::forward<Comp>(
comp));
662template <
typename R, AlephAdaptor Adaptor>
663 requires std::ranges::range<std::remove_cvref_t<R>>
674template <
template <
typename>
class Container>
677 template <
typename R>
678 requires std::ranges::range<std::remove_cvref_t<R>>
681 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
683 for (
auto &&
elem :
r)
714template <
template <
typename>
class Container>
717 template <
typename R>
718 requires std::ranges::range<std::remove_cvref_t<R>>
721 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
723 for (
auto &&
elem :
r)
743template <
template <
typename>
class Container>
746 template <
typename R>
747 requires std::ranges::range<std::remove_cvref_t<R>>
750 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
752 for (
auto &&
elem :
r)
779 template <
typename R>
780 requires std::ranges::range<std::remove_cvref_t<R>>
783 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
785 for (
auto &&
elem :
r)
810template <
typename Container, RangeLike R>
814 for (
auto &&
elem :
r)
816 if constexpr (
requires { result.append(
elem); })
817 result.append(std::forward<
decltype(
elem)>(
elem));
818 else if constexpr (
requires { result.insert(
elem); })
819 result.insert(std::forward<
decltype(
elem)>(
elem));
820 else if constexpr (
requires { result.push(
elem); })
821 result.push(std::forward<
decltype(
elem)>(
elem));
824 "Container must have append(), insert(), or push() method");
840template <
typename Container>
843 template <
typename R>
844 requires std::ranges::range<std::remove_cvref_t<R>>
864template <
typename Container>
882template <
typename Container,
typename Pred>
885 for (
auto it = c.get_it(); it.has_curr(); it.next_ne())
886 if (!
pred(it.get_curr()))
891template <
typename Container,
typename Pred>
894 for (
auto it = c.get_it(); it.has_curr(); it.next_ne())
895 if (
pred(it.get_curr()))
900template <
typename Container,
typename Pred>
912template <
typename Container,
typename T,
typename BinaryOp>
915 for (
auto &&
elem : c)
923template <
typename Container,
typename Pred>
926 for (
const auto &
elem : c)
935template <
typename Container,
typename Pred>
938 for (
const auto &
elem : c)
947template <
typename Container,
typename Pred>
956template <
typename Container,
typename Pred>
960 for (
const auto &
elem : c)
size_t size_t int32_t value
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_binary_ior > > operator|(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
int cmp(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
size_t blossom_maximum_cardinality_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, SA sa=SA())
Alias of compute_maximum_cardinality_general_matching().
Freq_Node * pred
Predecessor node in level-order traversal.
bool fallback_all_of(const Container &c, Pred &&pred)
auto ranges_count_if(const Container &c, Pred &&pred)
Fallback count_if using range-based for loop.
bool fallback_any_of(const Container &c, Pred &&pred)
constexpr T ranges_fold_left(Container &&c, T init, BinaryOp &&op)
Fallback fold_left using range-based for loop.
bool ranges_none_of(const Container &c, Pred &&pred)
Fallback none_of using range-based for loop.
bool fallback_none_of(const Container &c, Pred &&pred)
bool ranges_any_of(const Container &c, Pred &&pred)
Fallback any_of using range-based for loop.
bool ranges_all_of(const Container &c, Pred &&pred)
Fallback all_of using range-based for loop.
Main namespace for Aleph-w library functions.
void sort_range(Range &r, Cmp cmp)
Sort a whole range in place, portably across the ranges divide.
std::decay_t< typename HeadC::Item_Type > T
static std::atomic< bool > init
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.