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<class It, class EndOrSize> 13a8cf78c7SLouis Dionne // span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<_It>>>; 14a8cf78c7SLouis Dionne // 15a8cf78c7SLouis Dionne // template<class T, size_t N> 16a8cf78c7SLouis Dionne // span(T (&)[N]) -> span<T, N>; 17a8cf78c7SLouis Dionne // 18a8cf78c7SLouis Dionne // template<class T, size_t N> 19a8cf78c7SLouis Dionne // span(array<T, N>&) -> span<T, N>; 20a8cf78c7SLouis Dionne // 21a8cf78c7SLouis Dionne // template<class T, size_t N> 22a8cf78c7SLouis Dionne // span(const array<T, N>&) -> span<const T, N>; 23a8cf78c7SLouis Dionne // 24a8cf78c7SLouis Dionne // template<class R> 25a8cf78c7SLouis Dionne // span(R&&) -> span<remove_reference_t<ranges::range_reference_t<R>>>; 26a8cf78c7SLouis Dionne 27a8cf78c7SLouis Dionne 28a8cf78c7SLouis Dionne #include <span> 29a8cf78c7SLouis Dionne #include <array> 30a8cf78c7SLouis Dionne #include <cassert> 313cd4531bSNikolas Klauser #include <iterator> 32a8cf78c7SLouis Dionne #include <memory> 33a8cf78c7SLouis Dionne #include <string> 347cafe04eSXiaoyang Liu #include <type_traits> 35a8cf78c7SLouis Dionne 36a8cf78c7SLouis Dionne #include "test_macros.h" 37a8cf78c7SLouis Dionne 38a8cf78c7SLouis Dionne void test_iterator_sentinel() { 39a8cf78c7SLouis Dionne int arr[] = {1, 2, 3}; 40a8cf78c7SLouis Dionne { 41a8cf78c7SLouis Dionne std::span s{std::begin(arr), std::end(arr)}; 42a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<int>); 43a8cf78c7SLouis Dionne assert(s.size() == std::size(arr)); 44a8cf78c7SLouis Dionne assert(s.data() == std::data(arr)); 45a8cf78c7SLouis Dionne } 46a8cf78c7SLouis Dionne { 47a8cf78c7SLouis Dionne std::span s{std::begin(arr), 3}; 48a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<int>); 49a8cf78c7SLouis Dionne assert(s.size() == std::size(arr)); 50a8cf78c7SLouis Dionne assert(s.data() == std::data(arr)); 51a8cf78c7SLouis Dionne } 527cafe04eSXiaoyang Liu 53*7918e624SLouis Dionne #if TEST_STD_VER >= 26 547cafe04eSXiaoyang Liu // P3029R1: deduction from `integral_constant` 557cafe04eSXiaoyang Liu { 567cafe04eSXiaoyang Liu std::span s{std::begin(arr), std::integral_constant<size_t, 3>{}}; 577cafe04eSXiaoyang Liu ASSERT_SAME_TYPE(decltype(s), std::span<int, 3>); 587cafe04eSXiaoyang Liu assert(s.size() == std::size(arr)); 597cafe04eSXiaoyang Liu assert(s.data() == std::data(arr)); 607cafe04eSXiaoyang Liu } 617cafe04eSXiaoyang Liu #endif 62a8cf78c7SLouis Dionne } 63a8cf78c7SLouis Dionne 64a8cf78c7SLouis Dionne void test_c_array() { 65a8cf78c7SLouis Dionne { 66a8cf78c7SLouis Dionne int arr[] = {1, 2, 3}; 67a8cf78c7SLouis Dionne std::span s{arr}; 68a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<int, 3>); 69a8cf78c7SLouis Dionne assert(s.size() == std::size(arr)); 70a8cf78c7SLouis Dionne assert(s.data() == std::data(arr)); 71a8cf78c7SLouis Dionne } 72a8cf78c7SLouis Dionne 73a8cf78c7SLouis Dionne { 74a8cf78c7SLouis Dionne const int arr[] = {1,2,3}; 75a8cf78c7SLouis Dionne std::span s{arr}; 76a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<const int, 3>); 77a8cf78c7SLouis Dionne assert(s.size() == std::size(arr)); 78a8cf78c7SLouis Dionne assert(s.data() == std::data(arr)); 79a8cf78c7SLouis Dionne } 80a8cf78c7SLouis Dionne } 81a8cf78c7SLouis Dionne 82a8cf78c7SLouis Dionne void test_std_array() { 83a8cf78c7SLouis Dionne { 84a8cf78c7SLouis Dionne std::array<double, 4> arr = {1.0, 2.0, 3.0, 4.0}; 85a8cf78c7SLouis Dionne std::span s{arr}; 86a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<double, 4>); 87a8cf78c7SLouis Dionne assert(s.size() == arr.size()); 88a8cf78c7SLouis Dionne assert(s.data() == arr.data()); 89a8cf78c7SLouis Dionne } 90a8cf78c7SLouis Dionne 91a8cf78c7SLouis Dionne { 92a8cf78c7SLouis Dionne const std::array<long, 5> arr = {4, 5, 6, 7, 8}; 93a8cf78c7SLouis Dionne std::span s{arr}; 94a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<const long, 5>); 95a8cf78c7SLouis Dionne assert(s.size() == arr.size()); 96a8cf78c7SLouis Dionne assert(s.data() == arr.data()); 97a8cf78c7SLouis Dionne } 98a8cf78c7SLouis Dionne } 99a8cf78c7SLouis Dionne 100a8cf78c7SLouis Dionne void test_range_std_container() { 101a8cf78c7SLouis Dionne { 102a8cf78c7SLouis Dionne std::string str{"ABCDE"}; 103a8cf78c7SLouis Dionne std::span s{str}; 104a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<char>); 105a8cf78c7SLouis Dionne assert(s.size() == str.size()); 106a8cf78c7SLouis Dionne assert(s.data() == str.data()); 107a8cf78c7SLouis Dionne } 108a8cf78c7SLouis Dionne 109a8cf78c7SLouis Dionne { 110a8cf78c7SLouis Dionne const std::string str{"QWERTYUIOP"}; 111a8cf78c7SLouis Dionne std::span s{str}; 112a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(decltype(s), std::span<const char>); 113a8cf78c7SLouis Dionne assert(s.size() == str.size()); 114a8cf78c7SLouis Dionne assert(s.data() == str.data()); 115a8cf78c7SLouis Dionne } 116a8cf78c7SLouis Dionne } 117a8cf78c7SLouis Dionne 118a8cf78c7SLouis Dionne int main(int, char**) 119a8cf78c7SLouis Dionne { 120a8cf78c7SLouis Dionne test_iterator_sentinel(); 121a8cf78c7SLouis Dionne test_c_array(); 122a8cf78c7SLouis Dionne test_std_array(); 123a8cf78c7SLouis Dionne test_range_std_container(); 124a8cf78c7SLouis Dionne 125a8cf78c7SLouis Dionne return 0; 126a8cf78c7SLouis Dionne } 127