Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 3 additions & 95 deletions include/stdexec/__detail/__ranges.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@

#include "__config.hpp"

#if !STDEXEC_NO_STDCPP_RANGES()
#include <ranges>

# include <ranges>

# include "__prologue.hpp"
#include "__prologue.hpp"

namespace STDEXEC::ranges
{
Expand All @@ -34,94 +32,4 @@ namespace STDEXEC::ranges
using std::ranges::sentinel_t;
} // namespace STDEXEC::ranges

# include "__epilogue.hpp"

#else

# include <iterator>

# include "__prologue.hpp"

namespace STDEXEC::ranges
{

namespace __detail
{
constexpr void begin();
constexpr void end();

template <class _Ty>
concept __has_member_begin = requires(_Ty&& __val) { static_cast<_Ty&&>(__val).begin(); };

template <class _Ty>
concept __has_free_begin = __has_member_begin<_Ty>
|| requires(_Ty&& __val) { begin((static_cast<_Ty&&>(__val))); };

template <class _Ty>
concept __has_member_end = requires(_Ty&& __val) { static_cast<_Ty&&>(__val).end(); };

template <class _Ty>
concept __has_free_end = __has_member_end<_Ty>
|| requires(_Ty&& __val) { end((static_cast<_Ty&&>(__val))); };

struct __begin_t
{
template <class _Range>
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 <class _Range>
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 <class _Range>
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 <class _Range>
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 <class _Range>
using iterator_t = decltype(begin((__declval<_Range>())));

template <class _Range>
using sentinel_t = decltype(end((__declval<_Range>())));

template <class _Range>
using range_reference_t = decltype(*begin((__declval<_Range>())));

template <class _Range>
using range_value_t = std::iterator_traits<iterator_t<_Range>>::value_type;

} // namespace STDEXEC::ranges

# include "__epilogue.hpp"

#endif
#include "__epilogue.hpp"
Loading