125#if __cplusplus >= 202002L && __has_include(<ranges>)
130# if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 202106L
132# if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 160000
133# define ALEPH_HAS_RANGES 0
135# define ALEPH_HAS_RANGES 1
138# define ALEPH_HAS_RANGES 0
141# define ALEPH_HAS_RANGES 0
145#ifdef __cpp_lib_ranges_stride
146# define ALEPH_HAS_STRIDE 1
148# define ALEPH_HAS_STRIDE 0
151#ifdef __cpp_lib_ranges_repeat
152# define ALEPH_HAS_REPEAT 1
154# define ALEPH_HAS_REPEAT 0
157#ifdef __cpp_lib_ranges_zip
158# define ALEPH_HAS_ZIP 1
160# define ALEPH_HAS_ZIP 0
163#ifdef __cpp_lib_ranges_enumerate
164# define ALEPH_HAS_ENUMERATE 1
166# define ALEPH_HAS_ENUMERATE 0
169#include <type_traits>
180template <
typename T>
class DynList;
181template <
typename T>
class DynArray;
182template <
typename T>
class DynDlist;
183template <
typename T>
class DynListStack;
184template <
typename T>
class DynListQueue;
185template <
typename T>
class ArrayStack;
186template <
typename T>
class ArrayQueue;
187template <
typename T>
class Random_Set;
205 typename C::Iterator;
206 typename C::Item_Type;
207 { c.
begin() } -> std::input_or_output_iterator;
208 { c.
end() } -> std::sentinel_for<
decltype(c.begin())>;
223concept RangeLike = std::ranges::range<R>;
246template <AlephAppendable Container, RangeLike R>
250 for (
auto&&
elem : r)
251 result.append(std::forward<
decltype(
elem)>(
elem));
283template <
typename T =
int>
286 return std::views::iota(start, end);
295template <
typename T =
int>
298 return std::views::iota(
T{0}, n);
316template <
typename T =
int>
319 return std::views::iota(start);
333 return std::views::repeat(value) | std::views::take(n);
349template <RangeLike R,
typename Pred>
352 return std::ranges::all_of(std::forward<R>(r), std::forward<Pred>(
pred));
360template <RangeLike R,
typename Pred>
363 return std::ranges::any_of(std::forward<R>(r), std::forward<Pred>(
pred));
371template <RangeLike R,
typename Pred>
374 return std::ranges::none_of(std::forward<R>(r), std::forward<Pred>(
pred));
382template <RangeLike R,
typename Pred>
385 return std::ranges::find_if(std::forward<R>(r), std::forward<Pred>(
pred));
391template <RangeLike R,
typename Pred>
394 return std::ranges::count_if(std::forward<R>(r), std::forward<Pred>(
pred));
402template <RangeLike R,
typename Func>
405 return std::forward<R>(r) | std::views::transform(std::forward<Func>(func));
413template <RangeLike R,
typename Pred>
416 return std::forward<R>(r) | std::views::filter(std::forward<Pred>(
pred));
422template <RangeLike R>
425 return std::forward<R>(r) | std::views::take(n);
431template <RangeLike R>
434 return std::forward<R>(r) | std::views::drop(n);
442template <RangeLike R>
443 requires std::ranges::bidirectional_range<R>
446 return std::forward<R>(r) | std::views::reverse;
452template <RangeLike R>
455 return std::forward<R>(r) | std::views::join;
465 return std::views::zip(std::forward<Rs>(
rs)...);
469#if ALEPH_HAS_ENUMERATE
473template <RangeLike R>
476 return std::forward<R>(r) | std::views::enumerate;
485template <RangeLike R,
typename T,
typename BinaryOp>
488#ifdef __cpp_lib_ranges_fold
489 return std::ranges::fold_left(std::forward<R>(r),
init, std::forward<BinaryOp>(op));
492 for (
auto&&
elem : r)
501template <RangeLike R>
504 using T = std::ranges::range_value_t<R>;
511template <RangeLike R>
514 using T = std::ranges::range_value_t<R>;
521template <RangeLike R>
524 return std::ranges::min_element(std::forward<R>(r));
530template <RangeLike R>
533 return std::ranges::max_element(std::forward<R>(r));
539template <RangeLike R,
typename Comp = std::less<>>
542 std::ranges::sort(std::forward<R>(r), std::forward<Comp>(
comp));
575template <
typename R, AlephAdaptor Adaptor>
576 requires std::ranges::range<std::remove_cvref_t<R>>
579 return adaptor(std::forward<R>(r));
587template <
template <
typename>
class Container>
590 template <
typename R>
591 requires std::ranges::range<std::remove_cvref_t<R>>
594 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
596 for (
auto&&
elem : r)
597 result.append(std::forward<
decltype(
elem)>(
elem));
627template <
template <
typename>
class Container>
630 template <
typename R>
631 requires std::ranges::range<std::remove_cvref_t<R>>
634 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
636 for (
auto&&
elem : r)
637 result.push(std::forward<
decltype(
elem)>(
elem));
656template <
template <
typename>
class Container>
659 template <
typename R>
660 requires std::ranges::range<std::remove_cvref_t<R>>
663 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
665 for (
auto&&
elem : r)
666 result.put(std::forward<
decltype(
elem)>(
elem));
692 template <
typename R>
693 requires std::ranges::range<std::remove_cvref_t<R>>
696 using T = std::ranges::range_value_t<std::remove_cvref_t<R>>;
698 for (
auto&&
elem : r)
723template <
typename Container, RangeLike R>
727 for (
auto&&
elem : r)
729 if constexpr (
requires { result.append(
elem); })
730 result.append(std::forward<
decltype(
elem)>(
elem));
731 else if constexpr (
requires { result.insert(
elem); })
732 result.insert(std::forward<
decltype(
elem)>(
elem));
733 else if constexpr (
requires { result.push(
elem); })
734 result.push(std::forward<
decltype(
elem)>(
elem));
737 "Container must have append(), insert(), or push() method");
753template <
typename Container>
756 template <
typename R>
757 requires std::ranges::range<std::remove_cvref_t<R>>
777template <
typename Container>
793template <
typename Container,
typename Pred>
796 for (
auto it = c.get_it(); it.has_curr(); it.next_ne())
797 if (!
pred(it.get_curr()))
802template <
typename Container,
typename Pred>
805 for (
auto it = c.get_it(); it.has_curr(); it.next_ne())
806 if (
pred(it.get_curr()))
811template <
typename Container,
typename Pred>
823template <
typename Container,
typename T,
typename BinaryOp>
826 for (
auto&&
elem : c)
834template <
typename Container,
typename Pred>
837 for (
const auto&
elem : c)
846template <
typename Container,
typename Pred>
849 for (
const auto&
elem : c)
858template <
typename Container,
typename Pred>
867template <
typename Container,
typename Pred>
871 for (
const auto&
elem : c)
T & insert(const T &item)
Insert a new item by copy.
T & append(const T &item)
Append a new item by copy.
iterator begin() noexcept
Return an STL-compatible iterator to the first element.
__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)
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.
std::decay_t< typename HeadC::Item_Type > T
DynList< T > maps(const C &c, Op op)
Classic map operation.
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.
static StlIterator end(SetType &s)
Create an end iterator for the container.