77 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// constexpr auto data() requires contiguous_range<R>12// constexpr auto data() const requires contiguous_range<const R>13 14#include <ranges>15 16#include <array>17#include <cassert>18#include <concepts>19 20#include "test_iterators.h"21#include "test_macros.h"22 23template <class T>24concept HasData = requires (T t) {25 t.data();26};27 28constexpr bool test()29{30 {31 struct ContiguousIters {32 contiguous_iterator<int*> begin();33 sentinel_wrapper<contiguous_iterator<int*>> end();34 };35 using OwningView = std::ranges::owning_view<ContiguousIters>;36 static_assert(std::ranges::contiguous_range<OwningView&>);37 static_assert(!std::ranges::range<const OwningView&>); // no begin/end38 static_assert(HasData<OwningView&>);39 static_assert(HasData<OwningView&&>);40 static_assert(!HasData<const OwningView&>);41 static_assert(!HasData<const OwningView&&>);42 }43 {44 struct NoData {45 random_access_iterator<int*> begin();46 random_access_iterator<int*> end();47 };48 using OwningView = std::ranges::owning_view<NoData>;49 static_assert(!HasData<OwningView&>);50 static_assert(!HasData<OwningView&&>);51 static_assert(!HasData<const OwningView&>);52 static_assert(!HasData<const OwningView&&>);53 }54 {55 // Test a view.56 int a[] = {1};57 auto ov = std::ranges::owning_view(std::ranges::subrange(a, a+1));58 assert(ov.data() == a);59 assert(std::as_const(ov).data() == a);60 }61 {62 // Test a non-view.63 std::array<int, 2> a = {1, 2};64 auto ov = std::ranges::owning_view(std::move(a));65 assert(ov.data() != a.data()); // because it points into the copy66 assert(std::as_const(ov).data() != a.data());67 }68 return true;69}70 71int main(int, char**) {72 test();73 static_assert(test());74 75 return 0;76}77