| //===----------------------------------------------------------------------===// |
| // |
| // 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 |
| // UNSUPPORTED: libcpp-no-concepts |
| // UNSUPPORTED: libcpp-has-no-incomplete-ranges |
| |
| // class std::ranges::subrange; |
| |
| #include <ranges> |
| |
| #include <cassert> |
| #include "test_macros.h" |
| |
| constexpr void test_sized_subrange() |
| { |
| int a[4] = {1,2,3,4}; |
| auto r = std::ranges::subrange(a, a+4); |
| assert(std::ranges::sized_range<decltype(r)>); |
| { |
| auto [first, last] = r; |
| assert(first == a); |
| assert(last == a+4); |
| } |
| { |
| auto [first, last] = std::move(r); |
| assert(first == a); |
| assert(last == a+4); |
| } |
| { |
| auto [first, last] = std::as_const(r); |
| assert(first == a); |
| assert(last == a+4); |
| } |
| { |
| auto [first, last] = std::move(std::as_const(r)); |
| assert(first == a); |
| assert(last == a+4); |
| } |
| } |
| |
| constexpr void test_unsized_subrange() |
| { |
| int a[4] = {1,2,3,4}; |
| auto r = std::ranges::subrange(a, std::unreachable_sentinel); |
| assert(!std::ranges::sized_range<decltype(r)>); |
| { |
| auto [first, last] = r; |
| assert(first == a); |
| ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t); |
| } |
| { |
| auto [first, last] = std::move(r); |
| assert(first == a); |
| ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t); |
| } |
| { |
| auto [first, last] = std::as_const(r); |
| assert(first == a); |
| ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t); |
| } |
| { |
| auto [first, last] = std::move(std::as_const(r)); |
| assert(first == a); |
| ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t); |
| } |
| } |
| |
| constexpr void test_copies_not_originals() |
| { |
| int a[4] = {1,2,3,4}; |
| { |
| auto r = std::ranges::subrange(a, a+4); |
| auto&& [first, last] = r; |
| ASSERT_SAME_TYPE(decltype(first), int*); |
| ASSERT_SAME_TYPE(decltype(last), int*); |
| first = a+2; |
| last = a+2; |
| assert(r.begin() == a); |
| assert(r.end() == a+4); |
| } |
| { |
| const auto r = std::ranges::subrange(a, a+4); |
| auto&& [first, last] = r; |
| ASSERT_SAME_TYPE(decltype(first), int*); |
| ASSERT_SAME_TYPE(decltype(last), int*); |
| first = a+2; |
| last = a+2; |
| assert(r.begin() == a); |
| assert(r.end() == a+4); |
| } |
| } |
| |
| constexpr bool test() |
| { |
| test_sized_subrange(); |
| test_unsized_subrange(); |
| test_copies_not_originals(); |
| return true; |
| } |
| |
| int main(int, char**) |
| { |
| test(); |
| static_assert(test()); |
| |
| return 0; |
| } |