xref: /llvm-project/libcxx/test/std/containers/views/views.span/span.cons/stdarray.pass.cpp (revision 355e0ce3c5366bd0b564a25e4b6675353da3c53e)
1a8cf78c7SLouis Dionne //===----------------------------------------------------------------------===//
2a8cf78c7SLouis Dionne //
3a8cf78c7SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a8cf78c7SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5a8cf78c7SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a8cf78c7SLouis Dionne //
7a8cf78c7SLouis Dionne //===----------------------------------------------------------------------===//
8a8cf78c7SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
9a8cf78c7SLouis Dionne 
10a8cf78c7SLouis Dionne // <span>
11a8cf78c7SLouis Dionne 
12a8cf78c7SLouis Dionne // template<size_t N>
13a8cf78c7SLouis Dionne //     constexpr span(array<value_type, N>& arr) noexcept;
14a8cf78c7SLouis Dionne // template<size_t N>
15a8cf78c7SLouis Dionne //     constexpr span(const array<value_type, N>& arr) noexcept;
16a8cf78c7SLouis Dionne //
17a8cf78c7SLouis Dionne // Remarks: These constructors shall not participate in overload resolution unless:
18*355e0ce3SLouis Dionne //   - extent == dynamic_extent || N == extent is true, and
19*355e0ce3SLouis Dionne //   - remove_pointer_t<decltype(data(arr))>(*)[] is convertible to ElementType(*)[].
20a8cf78c7SLouis Dionne //
21a8cf78c7SLouis Dionne 
22a8cf78c7SLouis Dionne 
23a8cf78c7SLouis Dionne #include <span>
24a8cf78c7SLouis Dionne #include <array>
25a8cf78c7SLouis Dionne #include <cassert>
26a8cf78c7SLouis Dionne #include <string>
27a8cf78c7SLouis Dionne 
28a8cf78c7SLouis Dionne #include "test_macros.h"
29a8cf78c7SLouis Dionne 
checkCV()30a8cf78c7SLouis Dionne void checkCV()
31a8cf78c7SLouis Dionne {
32a8cf78c7SLouis Dionne     std::array<int, 3> arr  = {1,2,3};
33a8cf78c7SLouis Dionne //  STL says these are not cromulent
34a8cf78c7SLouis Dionne //  std::array<const int,3> carr = {4,5,6};
35a8cf78c7SLouis Dionne //  std::array<volatile int, 3> varr = {7,8,9};
36a8cf78c7SLouis Dionne //  std::array<const volatile int, 3> cvarr = {1,3,5};
37a8cf78c7SLouis Dionne 
38a8cf78c7SLouis Dionne //  Types the same (dynamic sized)
39a8cf78c7SLouis Dionne     {
40a8cf78c7SLouis Dionne     std::span<               int> s1{  arr};    // a span<               int> pointing at int.
41a8cf78c7SLouis Dionne     }
42a8cf78c7SLouis Dionne 
43a8cf78c7SLouis Dionne //  Types the same (static sized)
44a8cf78c7SLouis Dionne     {
45a8cf78c7SLouis Dionne     std::span<               int,3> s1{  arr};  // a span<               int> pointing at int.
46a8cf78c7SLouis Dionne     }
47a8cf78c7SLouis Dionne 
48a8cf78c7SLouis Dionne 
49a8cf78c7SLouis Dionne //  types different (dynamic sized)
50a8cf78c7SLouis Dionne     {
51a8cf78c7SLouis Dionne     std::span<const          int> s1{ arr};     // a span<const          int> pointing at int.
52a8cf78c7SLouis Dionne     std::span<      volatile int> s2{ arr};     // a span<      volatile int> pointing at int.
53a8cf78c7SLouis Dionne     std::span<      volatile int> s3{ arr};     // a span<      volatile int> pointing at const int.
54a8cf78c7SLouis Dionne     std::span<const volatile int> s4{ arr};     // a span<const volatile int> pointing at int.
55a8cf78c7SLouis Dionne     }
56a8cf78c7SLouis Dionne 
57a8cf78c7SLouis Dionne //  types different (static sized)
58a8cf78c7SLouis Dionne     {
59a8cf78c7SLouis Dionne     std::span<const          int,3> s1{ arr};   // a span<const          int> pointing at int.
60a8cf78c7SLouis Dionne     std::span<      volatile int,3> s2{ arr};   // a span<      volatile int> pointing at int.
61a8cf78c7SLouis Dionne     std::span<      volatile int,3> s3{ arr};   // a span<      volatile int> pointing at const int.
62a8cf78c7SLouis Dionne     std::span<const volatile int,3> s4{ arr};   // a span<const volatile int> pointing at int.
63a8cf78c7SLouis Dionne     }
64a8cf78c7SLouis Dionne }
65a8cf78c7SLouis Dionne 
66a8cf78c7SLouis Dionne template <typename T, typename U>
testConstructorArray()67a8cf78c7SLouis Dionne constexpr bool testConstructorArray() {
68a8cf78c7SLouis Dionne   std::array<U, 2> val = {U(), U()};
69a8cf78c7SLouis Dionne   ASSERT_NOEXCEPT(std::span<T>{val});
70a8cf78c7SLouis Dionne   ASSERT_NOEXCEPT(std::span<T, 2>{val});
71a8cf78c7SLouis Dionne   std::span<T> s1{val};
72a8cf78c7SLouis Dionne   std::span<T, 2> s2{val};
73a8cf78c7SLouis Dionne   return s1.data() == &val[0] && s1.size() == 2 && s2.data() == &val[0] &&
74a8cf78c7SLouis Dionne          s2.size() == 2;
75a8cf78c7SLouis Dionne }
76a8cf78c7SLouis Dionne 
77a8cf78c7SLouis Dionne template <typename T, typename U>
testConstructorConstArray()78a8cf78c7SLouis Dionne constexpr bool testConstructorConstArray() {
79a8cf78c7SLouis Dionne   const std::array<U, 2> val = {U(), U()};
80a8cf78c7SLouis Dionne   ASSERT_NOEXCEPT(std::span<const T>{val});
81a8cf78c7SLouis Dionne   ASSERT_NOEXCEPT(std::span<const T, 2>{val});
82a8cf78c7SLouis Dionne   std::span<const T> s1{val};
83a8cf78c7SLouis Dionne   std::span<const T, 2> s2{val};
84a8cf78c7SLouis Dionne   return s1.data() == &val[0] && s1.size() == 2 && s2.data() == &val[0] &&
85a8cf78c7SLouis Dionne          s2.size() == 2;
86a8cf78c7SLouis Dionne }
87a8cf78c7SLouis Dionne 
88a8cf78c7SLouis Dionne template <typename T>
testConstructors()89a8cf78c7SLouis Dionne constexpr bool testConstructors() {
90a8cf78c7SLouis Dionne   static_assert(testConstructorArray<T, T>(), "");
91a8cf78c7SLouis Dionne   static_assert(testConstructorArray<const T, const T>(), "");
92a8cf78c7SLouis Dionne   static_assert(testConstructorArray<const T, T>(), "");
93a8cf78c7SLouis Dionne   static_assert(testConstructorConstArray<T, T>(), "");
94a8cf78c7SLouis Dionne   static_assert(testConstructorConstArray<const T, const T>(), "");
95a8cf78c7SLouis Dionne   static_assert(testConstructorConstArray<const T, T>(), "");
96a8cf78c7SLouis Dionne 
97a8cf78c7SLouis Dionne   return testConstructorArray<T, T>() &&
98a8cf78c7SLouis Dionne          testConstructorArray<const T, const T>() &&
99a8cf78c7SLouis Dionne          testConstructorArray<const T, T>() &&
100a8cf78c7SLouis Dionne          testConstructorConstArray<T, T>() &&
101a8cf78c7SLouis Dionne          testConstructorConstArray<const T, const T>() &&
102a8cf78c7SLouis Dionne          testConstructorConstArray<const T, T>();
103a8cf78c7SLouis Dionne }
104a8cf78c7SLouis Dionne 
105a8cf78c7SLouis Dionne struct A{};
106a8cf78c7SLouis Dionne 
main(int,char **)107a8cf78c7SLouis Dionne int main(int, char**)
108a8cf78c7SLouis Dionne {
109a8cf78c7SLouis Dionne     assert(testConstructors<int>());
110a8cf78c7SLouis Dionne     assert(testConstructors<long>());
111a8cf78c7SLouis Dionne     assert(testConstructors<double>());
112a8cf78c7SLouis Dionne     assert(testConstructors<A>());
113a8cf78c7SLouis Dionne 
114a8cf78c7SLouis Dionne     assert(testConstructors<int*>());
115a8cf78c7SLouis Dionne     assert(testConstructors<const int*>());
116a8cf78c7SLouis Dionne 
117a8cf78c7SLouis Dionne     checkCV();
118a8cf78c7SLouis Dionne 
119a8cf78c7SLouis Dionne     return 0;
120a8cf78c7SLouis Dionne }
121