mpc
Haskell-like feature supports in C++
ranges.hpp
Go to the documentation of this file.
1
2#pragma once
3#include <iterator>
5
6#if defined(__cpp_lib_ranges)
7
8#include <ranges>
9
10namespace mpc::ranges::inline cpo {
11 // clang-format off
12 using std::ranges::begin,
13 std::ranges::end,
14 std::ranges::range,
15 std::ranges::input_range,
16 std::ranges::iterator_t,std::ranges::sentinel_t,
17 std::ranges::range_difference_t,
18 std::ranges::range_value_t,
19 std::ranges::range_reference_t,
20 std::ranges::range_rvalue_reference_t;
21 // clang-format on
22}
23
24#else
25
26namespace mpc::ranges::detail {
27 using std::begin, std::end;
28
29 struct begin_fn {
30 template <class C>
31 constexpr auto operator()(C&& c) const noexcept(noexcept(begin(c))) -> decltype(begin(c)) {
32 return begin(c);
33 }
34 };
35
36 struct end_fn {
37 template <class C>
38 constexpr auto operator()(C&& c) const noexcept(noexcept(end(c))) -> decltype(end(c)) {
39 return end(c);
40 }
41 };
42} // namespace mpc::ranges::detail
43
44namespace mpc::ranges::inline cpo {
45 inline constexpr detail::begin_fn begin{};
46 inline constexpr detail::end_fn end{};
47} // namespace mpc::ranges::inline cpo
48
49namespace mpc::ranges {
50 template <class T>
51 concept range = requires(T& t) {
52 ranges::begin(t); // equality-preserving for forward iterators
53 ranges::end(t);
54 };
55
56 template <class T>
57 using iterator_t = decltype(ranges::begin(std::declval<T&>()));
58
59 template <ranges::range R>
60 using sentinel_t = decltype(ranges::end(std::declval<R&>()));
61
62 template <ranges::range R>
63 using range_difference_t = std::iter_difference_t<ranges::iterator_t<R>>;
64
65 template <ranges::range R>
66 using range_value_t = std::iter_value_t<ranges::iterator_t<R>>;
67
68 template <ranges::range R>
69 using range_reference_t = std::iter_reference_t<ranges::iterator_t<R>>;
70
71 template <ranges::range R>
72 using range_rvalue_reference_t = std::iter_rvalue_reference_t<ranges::iterator_t<R>>;
73
74 template <class T>
75 concept input_range = ranges::range<T> and std::input_iterator<ranges::iterator_t<T>>;
76} // namespace mpc::ranges
77
78#endif
Definition: ranges.hpp:29
Definition: ranges.hpp:36