//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // This is a compile-only test, so "inline function is not defined" warnings are irrelevant. // ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-undefined-inline // template // requires view && view && // indirectly_comparable, iterator_t, ranges::equal_to> && // (forward_range || tiny-range) // class lazy_split_view; #include #include #include "test_iterators.h" #include "types.h" struct ForwardRange { forward_iterator begin() const; forward_iterator end() const; }; static_assert( std::ranges::forward_range); template concept CanInstantiate = requires { typename std::ranges::lazy_split_view; }; // All constraints satisfied (`View` and `Pattern` are forward views). namespace test1 { using View = ForwardView; using Pattern = ForwardView; static_assert( std::ranges::forward_range); static_assert( std::ranges::forward_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert( CanInstantiate); } // namespace test1 // All constraints satisfied (`View` is an input view and `Pattern` is a tiny view). namespace test2 { using View = InputView; using Pattern = ForwardTinyView; static_assert( std::ranges::input_range); static_assert( std::ranges::forward_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert( CanInstantiate); } // namespace test2 // `View` is not an input range. namespace test3 { struct AlmostInputIterator { using value_type = char; using difference_type = std::ptrdiff_t; using iterator_concept = int; constexpr const char& operator*() const; constexpr AlmostInputIterator& operator++(); constexpr void operator++(int); constexpr bool operator==(const AlmostInputIterator&) const; }; static_assert( std::input_or_output_iterator); static_assert(!std::input_iterator); struct NonInputView : std::ranges::view_base { AlmostInputIterator begin() const; AlmostInputIterator end() const; }; using View = NonInputView; using Pattern = ForwardTinyView; static_assert(!std::ranges::input_range); static_assert( std::ranges::forward_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert(!CanInstantiate); } // namespace test3 // `View` is not a view. namespace test4 { using View = ForwardRange; using Pattern = ForwardView; static_assert( std::ranges::input_range); static_assert( std::ranges::forward_range); static_assert(!std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert(!CanInstantiate); } // namespace test4 // `Pattern` is not a forward range. namespace test5 { using View = ForwardView; using Pattern = InputView; static_assert( std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert(!CanInstantiate); } // namespace test5 // Not indirectly comparable. namespace test6 { struct Empty{}; struct IntForwardView : std::ranges::view_base { constexpr forward_iterator begin() const { return {}; } constexpr forward_iterator end() const { return {}; } }; using View = ForwardView; using Pattern = IntForwardView; static_assert( std::ranges::input_range); static_assert( std::ranges::forward_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert(!std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert(!CanInstantiate); } // namespace test6 // `View` is an input range and `Pattern` is not a tiny range. namespace test7 { using View = InputView; using Pattern = ForwardView; static_assert( std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert( std::ranges::forward_range); LIBCPP_STATIC_ASSERT(!std::ranges::__tiny_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert(!CanInstantiate); } // namespace test7 // `View` is an input range and `Pattern` is almost a tiny range, except the `size()` function is not `constexpr`. namespace test8 { struct AlmostTinyRange : std::ranges::view_base { int* begin() const; int* end() const; static std::size_t size() { return 1; } }; using View = InputView; using Pattern = AlmostTinyRange; static_assert( std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert( std::ranges::forward_range); LIBCPP_STATIC_ASSERT(!std::ranges::__tiny_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert(!CanInstantiate); } // namespace test8 // `View` is an input range and `Pattern` is almost a tiny range, except the `size()` returns a number `>2`. namespace test9 { struct AlmostTinyRange : std::ranges::view_base { int* begin() const; int* end() const; constexpr static std::size_t size() { return 2; } }; using View = InputView; using Pattern = ForwardView; static_assert( std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert( std::ranges::forward_range); LIBCPP_STATIC_ASSERT(!std::ranges::__tiny_range); static_assert( std::ranges::view); static_assert( std::ranges::view); static_assert( std::indirectly_comparable< std::ranges::iterator_t, std::ranges::iterator_t, std::ranges::equal_to>); static_assert(!CanInstantiate); } // namespace test9