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 // UNSUPPORTED: c++03, c++11, c++14, c++17 9 10 // <span> 11 12 // template<class It, class EndOrSize> 13 // span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<_It>>>; 14 // 15 // template<class T, size_t N> 16 // span(T (&)[N]) -> span<T, N>; 17 // 18 // template<class T, size_t N> 19 // span(array<T, N>&) -> span<T, N>; 20 // 21 // template<class T, size_t N> 22 // span(const array<T, N>&) -> span<const T, N>; 23 // 24 // template<class R> 25 // span(R&&) -> span<remove_reference_t<ranges::range_reference_t<R>>>; 26 27 28 #include <span> 29 #include <array> 30 #include <cassert> 31 #include <iterator> 32 #include <memory> 33 #include <string> 34 35 #include "test_macros.h" 36 37 void test_iterator_sentinel() { 38 int arr[] = {1, 2, 3}; 39 { 40 std::span s{std::begin(arr), std::end(arr)}; 41 ASSERT_SAME_TYPE(decltype(s), std::span<int>); 42 assert(s.size() == std::size(arr)); 43 assert(s.data() == std::data(arr)); 44 } 45 { 46 std::span s{std::begin(arr), 3}; 47 ASSERT_SAME_TYPE(decltype(s), std::span<int>); 48 assert(s.size() == std::size(arr)); 49 assert(s.data() == std::data(arr)); 50 } 51 } 52 53 void test_c_array() { 54 { 55 int arr[] = {1, 2, 3}; 56 std::span s{arr}; 57 ASSERT_SAME_TYPE(decltype(s), std::span<int, 3>); 58 assert(s.size() == std::size(arr)); 59 assert(s.data() == std::data(arr)); 60 } 61 62 { 63 const int arr[] = {1,2,3}; 64 std::span s{arr}; 65 ASSERT_SAME_TYPE(decltype(s), std::span<const int, 3>); 66 assert(s.size() == std::size(arr)); 67 assert(s.data() == std::data(arr)); 68 } 69 } 70 71 void test_std_array() { 72 { 73 std::array<double, 4> arr = {1.0, 2.0, 3.0, 4.0}; 74 std::span s{arr}; 75 ASSERT_SAME_TYPE(decltype(s), std::span<double, 4>); 76 assert(s.size() == arr.size()); 77 assert(s.data() == arr.data()); 78 } 79 80 { 81 const std::array<long, 5> arr = {4, 5, 6, 7, 8}; 82 std::span s{arr}; 83 ASSERT_SAME_TYPE(decltype(s), std::span<const long, 5>); 84 assert(s.size() == arr.size()); 85 assert(s.data() == arr.data()); 86 } 87 } 88 89 void test_range_std_container() { 90 { 91 std::string str{"ABCDE"}; 92 std::span s{str}; 93 ASSERT_SAME_TYPE(decltype(s), std::span<char>); 94 assert(s.size() == str.size()); 95 assert(s.data() == str.data()); 96 } 97 98 { 99 const std::string str{"QWERTYUIOP"}; 100 std::span s{str}; 101 ASSERT_SAME_TYPE(decltype(s), std::span<const char>); 102 assert(s.size() == str.size()); 103 assert(s.data() == str.data()); 104 } 105 } 106 107 int main(int, char**) 108 { 109 test_iterator_sentinel(); 110 test_c_array(); 111 test_std_array(); 112 test_range_std_container(); 113 114 return 0; 115 } 116