From 2c2bbad854fb7bca0e247ee73c8cc396911d8164 Mon Sep 17 00:00:00 2001 From: Eric Niebler Date: Sun, 10 May 2026 19:10:09 -0700 Subject: [PATCH] Assume the presence of c++20 ranges --- include/stdexec/__detail/__ranges.hpp | 98 +-------------------------- 1 file changed, 3 insertions(+), 95 deletions(-) diff --git a/include/stdexec/__detail/__ranges.hpp b/include/stdexec/__detail/__ranges.hpp index 71e738a63..fdbe5a2ec 100644 --- a/include/stdexec/__detail/__ranges.hpp +++ b/include/stdexec/__detail/__ranges.hpp @@ -17,11 +17,9 @@ #include "__config.hpp" -#if !STDEXEC_NO_STDCPP_RANGES() +#include -# include - -# include "__prologue.hpp" +#include "__prologue.hpp" namespace STDEXEC::ranges { @@ -34,94 +32,4 @@ namespace STDEXEC::ranges using std::ranges::sentinel_t; } // namespace STDEXEC::ranges -# include "__epilogue.hpp" - -#else - -# include - -# include "__prologue.hpp" - -namespace STDEXEC::ranges -{ - - namespace __detail - { - constexpr void begin(); - constexpr void end(); - - template - concept __has_member_begin = requires(_Ty&& __val) { static_cast<_Ty&&>(__val).begin(); }; - - template - concept __has_free_begin = __has_member_begin<_Ty> - || requires(_Ty&& __val) { begin((static_cast<_Ty&&>(__val))); }; - - template - concept __has_member_end = requires(_Ty&& __val) { static_cast<_Ty&&>(__val).end(); }; - - template - concept __has_free_end = __has_member_end<_Ty> - || requires(_Ty&& __val) { end((static_cast<_Ty&&>(__val))); }; - - struct __begin_t - { - template - requires __has_member_begin<_Range> - auto - operator()(_Range&& __rng) const noexcept(noexcept((static_cast<_Range&&>(__rng)).begin())) - -> decltype((static_cast<_Range&&>(__rng)).begin()) - { - return static_cast<_Range&&>(__rng).begin(); - } - - template - requires __has_free_begin<_Range> - auto - operator()(_Range&& __rng) const noexcept(noexcept(begin((static_cast<_Range&&>(__rng))))) - -> decltype(begin((static_cast<_Range&&>(__rng)))) - { - return begin((static_cast<_Range&&>(__rng))); - } - }; - - struct __end_t - { - template - requires __has_member_end<_Range> - auto operator()(_Range&& __rng) const noexcept(noexcept((static_cast<_Range&&>(__rng)).end())) - -> decltype((static_cast<_Range&&>(__rng)).end()) - { - return static_cast<_Range&&>(__rng).end(); - } - - template - requires __has_free_end<_Range> - auto operator()(_Range&& __rng) const noexcept(noexcept(end((static_cast<_Range&&>(__rng))))) - -> decltype(end((static_cast<_Range&&>(__rng)))) - { - return end((static_cast<_Range&&>(__rng))); - } - }; - } // namespace __detail - - inline constexpr __detail::__begin_t begin{}; - inline constexpr __detail::__end_t end{}; - - template - using iterator_t = decltype(begin((__declval<_Range>()))); - - template - using sentinel_t = decltype(end((__declval<_Range>()))); - - template - using range_reference_t = decltype(*begin((__declval<_Range>()))); - - template - using range_value_t = std::iterator_traits>::value_type; - -} // namespace STDEXEC::ranges - -# include "__epilogue.hpp" - -#endif +#include "__epilogue.hpp"