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