#include <ranges>
#include "test_iterators.h"
struct View : std::ranges::view_base {
int *begin() const;
int *end() const;
};
struct Range {
int *begin() const;
int *end() const;
};
struct BorrowableRange {
int *begin() const;
int *end() const;
};
template<>
inline constexpr bool std::ranges::enable_borrowed_range<BorrowableRange> = true;
template <class T>
concept HasAllT = requires {
typename std::views::all_t<T>;
};
ASSERT_SAME_TYPE(std::views::all_t<View>, View);
ASSERT_SAME_TYPE(std::views::all_t<View&>, View);
ASSERT_SAME_TYPE(std::views::all_t<View&&>, View);
ASSERT_SAME_TYPE(std::views::all_t<const View>, View);
ASSERT_SAME_TYPE(std::views::all_t<const View&>, View);
ASSERT_SAME_TYPE(std::views::all_t<const View&&>, View);
ASSERT_SAME_TYPE(std::views::all_t<Range&>, std::ranges::ref_view<Range>);
ASSERT_SAME_TYPE(std::views::all_t<const Range&>, std::ranges::ref_view<const Range>);
ASSERT_SAME_TYPE(std::views::all_t<BorrowableRange&>, std::ranges::ref_view<BorrowableRange>);
ASSERT_SAME_TYPE(std::views::all_t<const BorrowableRange&>, std::ranges::ref_view<const BorrowableRange>);
ASSERT_SAME_TYPE(std::views::all_t<Range>, std::ranges::owning_view<Range>);
ASSERT_SAME_TYPE(std::views::all_t<Range&&>, std::ranges::owning_view<Range>);
static_assert(!HasAllT<const Range>);
static_assert(!HasAllT<const Range&&>);
ASSERT_SAME_TYPE(std::views::all_t<BorrowableRange>, std::ranges::owning_view<BorrowableRange>);
ASSERT_SAME_TYPE(std::views::all_t<BorrowableRange&&>, std::ranges::owning_view<BorrowableRange>);
static_assert(!HasAllT<const BorrowableRange>);
static_assert(!HasAllT<const BorrowableRange&&>);