#include <ranges>
#include <type_traits>
#include "test_iterators.h"
#include "test_range.h"
struct T1 { };
static_assert(!std::ranges::range<T1>);
static_assert(!std::ranges::viewable_range<T1>);
static_assert(!std::ranges::viewable_range<T1&>);
static_assert(!std::ranges::viewable_range<T1&&>);
static_assert(!std::ranges::viewable_range<T1 const>);
static_assert(!std::ranges::viewable_range<T1 const&>);
static_assert(!std::ranges::viewable_range<T1 const&&>);
struct T2 : test_range<cpp20_input_iterator>, std::ranges::view_base {
T2(T2 const&) = default;
};
static_assert(std::ranges::range<T2>);
static_assert(std::ranges::view<T2>);
static_assert(std::constructible_from<T2, T2>);
static_assert(std::ranges::viewable_range<T2>);
static_assert(std::ranges::viewable_range<T2&>);
static_assert(std::ranges::viewable_range<T2&&>);
static_assert(std::ranges::viewable_range<T2 const>);
static_assert(std::ranges::viewable_range<T2 const&>);
static_assert(std::ranges::viewable_range<T2 const&&>);
struct T3 : test_range<cpp20_input_iterator>, std::ranges::view_base {
T3(T3 const&) = default;
};
static_assert(std::ranges::range<T3>);
static_assert(std::ranges::view<T3>);
static_assert(std::constructible_from<T3, T3>);
static_assert(std::ranges::viewable_range<T3>);
static_assert(std::ranges::viewable_range<T3&>);
static_assert(std::ranges::viewable_range<T3&&>);
static_assert(std::ranges::viewable_range<T3 const>);
static_assert(std::ranges::viewable_range<T3 const&>);
static_assert(std::ranges::viewable_range<T3 const&&>);
struct T4 : test_range<cpp20_input_iterator>, std::ranges::view_base {
T4(T4 const&) = delete;
T4(T4&&) = default;
T4& operator=(T4&&) = default;
};
static_assert(std::ranges::range<T4 const&>);
static_assert(std::ranges::view<std::remove_cvref_t<T4 const&>>);
static_assert(!std::constructible_from<std::remove_cvref_t<T4 const&>, T4 const&>);
static_assert(!std::ranges::viewable_range<T4 const&>);
struct T5 : test_range<cpp20_input_iterator> { };
static_assert( std::ranges::range<T5>);
static_assert(!std::ranges::view<T5>);
static_assert( std::constructible_from<T5, T5>);
static_assert( std::movable<T5>);
static_assert(!std::movable<const T5>);
static_assert( std::ranges::viewable_range<T5>);
static_assert( std::ranges::viewable_range<T5&>);
static_assert( std::ranges::viewable_range<T5&&>);
static_assert(!std::ranges::viewable_range<const T5>);
static_assert( std::ranges::viewable_range<const T5&>);
static_assert(!std::ranges::viewable_range<const T5&&>);
static_assert( std::ranges::range<std::initializer_list<int>>);
static_assert(!std::ranges::view<std::initializer_list<int>>);
static_assert( std::constructible_from<std::initializer_list<int>, std::initializer_list<int>>);
static_assert( std::movable<std::initializer_list<int>>);
static_assert(!std::ranges::viewable_range<std::initializer_list<int>>);
static_assert( std::ranges::viewable_range<std::initializer_list<int>&>);
static_assert(!std::ranges::viewable_range<std::initializer_list<int>&&>);
static_assert(!std::ranges::viewable_range<std::initializer_list<int> const>);
static_assert( std::ranges::viewable_range<std::initializer_list<int> const&>);
static_assert(!std::ranges::viewable_range<std::initializer_list<int> const&&>);
struct T6 : test_range<cpp20_input_iterator> { T6(T6&&); T6& operator=(T6&&) = delete; };
static_assert( std::ranges::range<T6>);
static_assert(!std::ranges::view<T6>);
static_assert( std::constructible_from<T6, T6>);
static_assert(!std::movable<T6>);
static_assert(!std::ranges::viewable_range<T6>);
static_assert( std::ranges::viewable_range<T6&>);
static_assert(!std::ranges::viewable_range<T6&&>);
static_assert(!std::ranges::viewable_range<const T6>);
static_assert( std::ranges::viewable_range<const T6&>);
static_assert(!std::ranges::viewable_range<const T6&&>);
struct T7 : test_range<cpp20_input_iterator> {
T7(T7 const&) = delete;
};
static_assert(std::ranges::range<T7&>);
static_assert(!std::ranges::view<std::remove_cvref_t<T7&>>);
static_assert(!std::constructible_from<std::remove_cvref_t<T7&>, T7&>);
static_assert(!std::ranges::viewable_range<T7>);
static_assert( std::ranges::viewable_range<T7&>);
static_assert(!std::ranges::viewable_range<T7&&>);
static_assert(!std::ranges::viewable_range<const T7>);
static_assert( std::ranges::viewable_range<const T7&>);
static_assert(!std::ranges::viewable_range<const T7&&>);
struct T8 : test_range<cpp20_input_iterator> {
T8(T8 const&) = delete;
};
static_assert(std::ranges::range<T8>);
static_assert(!std::ranges::view<T8>);
static_assert(!std::constructible_from<T8, T8>);
static_assert(!std::ranges::viewable_range<T8>);
static_assert( std::ranges::viewable_range<T8&>);
static_assert(!std::ranges::viewable_range<T8&&>);
static_assert(!std::ranges::viewable_range<const T8>);
static_assert( std::ranges::viewable_range<const T8&>);
static_assert(!std::ranges::viewable_range<const T8&&>);
static_assert(!std::ranges::viewable_range<void>);
static_assert(!std::ranges::viewable_range<int>);
static_assert(!std::ranges::viewable_range<int (*)(char)>);
static_assert(!std::ranges::viewable_range<int[]>);
static_assert(!std::ranges::viewable_range<int[10]>);
static_assert(!std::ranges::viewable_range<int(&)[]>);
static_assert( std::ranges::viewable_range<int(&)[10]>);
static_assert(!std::ranges::viewable_range<int(&&)[]>);
static_assert(!std::ranges::viewable_range<int(&&)[10]>);
struct Incomplete;
template<class T> struct Holder { T t; };
static_assert(!std::ranges::viewable_range<Holder<Incomplete>*>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>*&>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>*&&>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>* const>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>* const&>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>* const&&>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>*[10]>);
static_assert( std::ranges::viewable_range<Holder<Incomplete>*(&)[10]>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>*(&&)[10]>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>* const[10]>);
static_assert( std::ranges::viewable_range<Holder<Incomplete>* const(&)[10]>);
static_assert(!std::ranges::viewable_range<Holder<Incomplete>* const(&&)[10]>);