113 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// class std::ranges::subrange;12 13#include <cassert>14#include <ranges>15#include <utility>16 17#include "test_macros.h"18 19constexpr void test_sized_subrange()20{21 int a[4] = {1,2,3,4};22 auto r = std::ranges::subrange(a, a+4);23 assert(std::ranges::sized_range<decltype(r)>);24 {25 auto [first, last] = r;26 assert(first == a);27 assert(last == a+4);28 }29 {30 auto [first, last] = std::move(r);31 assert(first == a);32 assert(last == a+4);33 }34 {35 auto [first, last] = std::as_const(r);36 assert(first == a);37 assert(last == a+4);38 }39 {40 auto [first, last] = std::move(std::as_const(r));41 assert(first == a);42 assert(last == a+4);43 }44}45 46constexpr void test_unsized_subrange()47{48 int a[4] = {1,2,3,4};49 auto r = std::ranges::subrange(a, std::unreachable_sentinel);50 assert(!std::ranges::sized_range<decltype(r)>);51 {52 auto [first, last] = r;53 assert(first == a);54 ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);55 }56 {57 auto [first, last] = std::move(r);58 assert(first == a);59 ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);60 }61 {62 auto [first, last] = std::as_const(r);63 assert(first == a);64 ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);65 }66 {67 auto [first, last] = std::move(std::as_const(r));68 assert(first == a);69 ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);70 }71}72 73constexpr void test_copies_not_originals()74{75 int a[4] = {1,2,3,4};76 {77 auto r = std::ranges::subrange(a, a+4);78 auto&& [first, last] = r;79 ASSERT_SAME_TYPE(decltype(first), int*);80 ASSERT_SAME_TYPE(decltype(last), int*);81 first = a+2;82 last = a+2;83 assert(r.begin() == a);84 assert(r.end() == a+4);85 }86 {87 const auto r = std::ranges::subrange(a, a+4);88 auto&& [first, last] = r;89 ASSERT_SAME_TYPE(decltype(first), int*);90 ASSERT_SAME_TYPE(decltype(last), int*);91 first = a+2;92 last = a+2;93 assert(r.begin() == a);94 assert(r.end() == a+4);95 }96}97 98constexpr bool test()99{100 test_sized_subrange();101 test_unsized_subrange();102 test_copies_not_originals();103 return true;104}105 106int main(int, char**)107{108 test();109 static_assert(test());110 111 return 0;112}113