//===----------------------------------------------------------------------===// // // 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 // template // concept common_range; #include #include "test_iterators.h" template struct Common { It begin() const; It end() const; }; template struct NonCommon { It begin() const; sentinel_wrapper end() const; }; template struct Range { It begin() const; Sent end() const; }; static_assert(!std::ranges::common_range>>); // not a sentinel for itself static_assert(!std::ranges::common_range>>); // not a sentinel for itself static_assert( std::ranges::common_range>>); static_assert( std::ranges::common_range>>); static_assert( std::ranges::common_range>>); static_assert( std::ranges::common_range>>); static_assert( std::ranges::common_range>); static_assert(!std::ranges::common_range>>); static_assert(!std::ranges::common_range>>); static_assert(!std::ranges::common_range>>); static_assert(!std::ranges::common_range>>); static_assert(!std::ranges::common_range>>); static_assert(!std::ranges::common_range>>); static_assert(!std::ranges::common_range>); // Test when begin() and end() only differ by their constness. static_assert(!std::ranges::common_range>); // Simple test with a sized_sentinel. static_assert(!std::ranges::common_range>>); // Make sure cv-qualification doesn't impact the concept when begin() and end() have matching qualifiers. static_assert( std::ranges::common_range> const>); static_assert(!std::ranges::common_range> const>); // Test with a range that's a common_range only when const-qualified. struct Range1 { int* begin(); int const* begin() const; int const* end() const; }; static_assert(!std::ranges::common_range); static_assert( std::ranges::common_range); // Test with a range that's a common_range only when not const-qualified. struct Range2 { int* begin() const; int* end(); int const* end() const; }; static_assert( std::ranges::common_range); static_assert(!std::ranges::common_range); // Test ADL-proofing. struct Incomplete; template struct Holder { T t; }; static_assert(!std::ranges::common_range*>); static_assert(!std::ranges::common_range*&>); static_assert(!std::ranges::common_range*&&>); static_assert(!std::ranges::common_range* const>); static_assert(!std::ranges::common_range* const&>); static_assert(!std::ranges::common_range* const&&>); static_assert( std::ranges::common_range*[10]>); static_assert( std::ranges::common_range*(&)[10]>); static_assert( std::ranges::common_range*(&&)[10]>); static_assert( std::ranges::common_range* const[10]>); static_assert( std::ranges::common_range* const(&)[10]>); static_assert( std::ranges::common_range* const(&&)[10]>);