Skip to content

Commit 2c2bbad

Browse files
authored
Assume the presence of c++20 ranges
1 parent da7640a commit 2c2bbad

1 file changed

Lines changed: 3 additions & 95 deletions

File tree

include/stdexec/__detail/__ranges.hpp

Lines changed: 3 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717

1818
#include "__config.hpp"
1919

20-
#if !STDEXEC_NO_STDCPP_RANGES()
20+
#include <ranges>
2121

22-
# include <ranges>
23-
24-
# include "__prologue.hpp"
22+
#include "__prologue.hpp"
2523

2624
namespace STDEXEC::ranges
2725
{
@@ -34,94 +32,4 @@ namespace STDEXEC::ranges
3432
using std::ranges::sentinel_t;
3533
} // namespace STDEXEC::ranges
3634

37-
# include "__epilogue.hpp"
38-
39-
#else
40-
41-
# include <iterator>
42-
43-
# include "__prologue.hpp"
44-
45-
namespace STDEXEC::ranges
46-
{
47-
48-
namespace __detail
49-
{
50-
constexpr void begin();
51-
constexpr void end();
52-
53-
template <class _Ty>
54-
concept __has_member_begin = requires(_Ty&& __val) { static_cast<_Ty&&>(__val).begin(); };
55-
56-
template <class _Ty>
57-
concept __has_free_begin = __has_member_begin<_Ty>
58-
|| requires(_Ty&& __val) { begin((static_cast<_Ty&&>(__val))); };
59-
60-
template <class _Ty>
61-
concept __has_member_end = requires(_Ty&& __val) { static_cast<_Ty&&>(__val).end(); };
62-
63-
template <class _Ty>
64-
concept __has_free_end = __has_member_end<_Ty>
65-
|| requires(_Ty&& __val) { end((static_cast<_Ty&&>(__val))); };
66-
67-
struct __begin_t
68-
{
69-
template <class _Range>
70-
requires __has_member_begin<_Range>
71-
auto
72-
operator()(_Range&& __rng) const noexcept(noexcept((static_cast<_Range&&>(__rng)).begin()))
73-
-> decltype((static_cast<_Range&&>(__rng)).begin())
74-
{
75-
return static_cast<_Range&&>(__rng).begin();
76-
}
77-
78-
template <class _Range>
79-
requires __has_free_begin<_Range>
80-
auto
81-
operator()(_Range&& __rng) const noexcept(noexcept(begin((static_cast<_Range&&>(__rng)))))
82-
-> decltype(begin((static_cast<_Range&&>(__rng))))
83-
{
84-
return begin((static_cast<_Range&&>(__rng)));
85-
}
86-
};
87-
88-
struct __end_t
89-
{
90-
template <class _Range>
91-
requires __has_member_end<_Range>
92-
auto operator()(_Range&& __rng) const noexcept(noexcept((static_cast<_Range&&>(__rng)).end()))
93-
-> decltype((static_cast<_Range&&>(__rng)).end())
94-
{
95-
return static_cast<_Range&&>(__rng).end();
96-
}
97-
98-
template <class _Range>
99-
requires __has_free_end<_Range>
100-
auto operator()(_Range&& __rng) const noexcept(noexcept(end((static_cast<_Range&&>(__rng)))))
101-
-> decltype(end((static_cast<_Range&&>(__rng))))
102-
{
103-
return end((static_cast<_Range&&>(__rng)));
104-
}
105-
};
106-
} // namespace __detail
107-
108-
inline constexpr __detail::__begin_t begin{};
109-
inline constexpr __detail::__end_t end{};
110-
111-
template <class _Range>
112-
using iterator_t = decltype(begin((__declval<_Range>())));
113-
114-
template <class _Range>
115-
using sentinel_t = decltype(end((__declval<_Range>())));
116-
117-
template <class _Range>
118-
using range_reference_t = decltype(*begin((__declval<_Range>())));
119-
120-
template <class _Range>
121-
using range_value_t = std::iterator_traits<iterator_t<_Range>>::value_type;
122-
123-
} // namespace STDEXEC::ranges
124-
125-
# include "__epilogue.hpp"
126-
127-
#endif
35+
#include "__epilogue.hpp"

0 commit comments

Comments
 (0)