1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11, c++14, c++17 10 // UNSUPPORTED: libcpp-no-concepts 11 12 // template<class T> 13 // concept borrowed_range; 14 15 #include <ranges> 16 17 struct NotRange { 18 int begin() const; 19 int end() const; 20 }; 21 22 struct Range { 23 int *begin(); 24 int *end(); 25 }; 26 27 struct ConstRange { 28 int *begin() const; 29 int *end() const; 30 }; 31 32 struct BorrowedRange { 33 int *begin() const; 34 int *end() const; 35 }; 36 37 template<> 38 inline constexpr bool std::ranges::enable_borrowed_range<BorrowedRange> = true; 39 40 static_assert(!std::ranges::borrowed_range<NotRange>); 41 static_assert(!std::ranges::borrowed_range<NotRange&>); 42 static_assert(!std::ranges::borrowed_range<const NotRange>); 43 static_assert(!std::ranges::borrowed_range<const NotRange&>); 44 static_assert(!std::ranges::borrowed_range<NotRange&&>); 45 46 static_assert(!std::ranges::borrowed_range<Range>); 47 static_assert( std::ranges::borrowed_range<Range&>); 48 static_assert(!std::ranges::borrowed_range<const Range>); 49 static_assert(!std::ranges::borrowed_range<const Range&>); 50 static_assert(!std::ranges::borrowed_range<Range&&>); 51 52 static_assert(!std::ranges::borrowed_range<ConstRange>); 53 static_assert( std::ranges::borrowed_range<ConstRange&>); 54 static_assert(!std::ranges::borrowed_range<const ConstRange>); 55 static_assert( std::ranges::borrowed_range<const ConstRange&>); 56 static_assert(!std::ranges::borrowed_range<ConstRange&&>); 57 58 static_assert( std::ranges::borrowed_range<BorrowedRange>); 59 static_assert( std::ranges::borrowed_range<BorrowedRange&>); 60 static_assert( std::ranges::borrowed_range<const BorrowedRange>); 61 static_assert( std::ranges::borrowed_range<const BorrowedRange&>); 62 static_assert( std::ranges::borrowed_range<BorrowedRange&&>); 63