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 <memory> 32 #include <string> 33 34 #include "test_macros.h" 35 36 void test_iterator_sentinel() { 37 int arr[] = {1, 2, 3}; 38 { 39 std::span s{std::begin(arr), std::end(arr)}; 40 ASSERT_SAME_TYPE(decltype(s), std::span<int>); 41 assert(s.size() == std::size(arr)); 42 assert(s.data() == std::data(arr)); 43 } 44 { 45 std::span s{std::begin(arr), 3}; 46 ASSERT_SAME_TYPE(decltype(s), std::span<int>); 47 assert(s.size() == std::size(arr)); 48 assert(s.data() == std::data(arr)); 49 } 50 } 51 52 void test_c_array() { 53 { 54 int arr[] = {1, 2, 3}; 55 std::span s{arr}; 56 ASSERT_SAME_TYPE(decltype(s), std::span<int, 3>); 57 assert(s.size() == std::size(arr)); 58 assert(s.data() == std::data(arr)); 59 } 60 61 { 62 const int arr[] = {1,2,3}; 63 std::span s{arr}; 64 ASSERT_SAME_TYPE(decltype(s), std::span<const int, 3>); 65 assert(s.size() == std::size(arr)); 66 assert(s.data() == std::data(arr)); 67 } 68 } 69 70 void test_std_array() { 71 { 72 std::array<double, 4> arr = {1.0, 2.0, 3.0, 4.0}; 73 std::span s{arr}; 74 ASSERT_SAME_TYPE(decltype(s), std::span<double, 4>); 75 assert(s.size() == arr.size()); 76 assert(s.data() == arr.data()); 77 } 78 79 { 80 const std::array<long, 5> arr = {4, 5, 6, 7, 8}; 81 std::span s{arr}; 82 ASSERT_SAME_TYPE(decltype(s), std::span<const long, 5>); 83 assert(s.size() == arr.size()); 84 assert(s.data() == arr.data()); 85 } 86 } 87 88 void test_range_std_container() { 89 { 90 std::string str{"ABCDE"}; 91 std::span s{str}; 92 ASSERT_SAME_TYPE(decltype(s), std::span<char>); 93 assert(s.size() == str.size()); 94 assert(s.data() == str.data()); 95 } 96 97 { 98 const std::string str{"QWERTYUIOP"}; 99 std::span s{str}; 100 ASSERT_SAME_TYPE(decltype(s), std::span<const char>); 101 assert(s.size() == str.size()); 102 assert(s.data() == str.data()); 103 } 104 } 105 106 int main(int, char**) 107 { 108 test_iterator_sentinel(); 109 test_c_array(); 110 test_std_array(); 111 test_range_std_container(); 112 113 return 0; 114 } 115