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 ElementType, size_t Extent> 13a8cf78c7SLouis Dionne // span<const byte, 14a8cf78c7SLouis Dionne // Extent == dynamic_extent 15a8cf78c7SLouis Dionne // ? dynamic_extent 16a8cf78c7SLouis Dionne // : sizeof(ElementType) * Extent> 17a8cf78c7SLouis Dionne // as_bytes(span<ElementType, Extent> s) noexcept; 18a8cf78c7SLouis Dionne 19a8cf78c7SLouis Dionne #include <cassert> 20*e99c4906SNikolas Klauser #include <cstddef> 21*e99c4906SNikolas Klauser #include <span> 22a8cf78c7SLouis Dionne #include <string> 23a8cf78c7SLouis Dionne 24a8cf78c7SLouis Dionne #include "test_macros.h" 25a8cf78c7SLouis Dionne 26a8cf78c7SLouis Dionne template<typename Span> 27a8cf78c7SLouis Dionne void testRuntimeSpan(Span sp) 28a8cf78c7SLouis Dionne { 29a8cf78c7SLouis Dionne ASSERT_NOEXCEPT(std::as_bytes(sp)); 30a8cf78c7SLouis Dionne 31a8cf78c7SLouis Dionne auto spBytes = std::as_bytes(sp); 32a8cf78c7SLouis Dionne using SB = decltype(spBytes); 33a8cf78c7SLouis Dionne ASSERT_SAME_TYPE(const std::byte, typename SB::element_type); 34a8cf78c7SLouis Dionne 35a8cf78c7SLouis Dionne if constexpr (sp.extent == std::dynamic_extent) 36a8cf78c7SLouis Dionne assert(spBytes.extent == std::dynamic_extent); 37a8cf78c7SLouis Dionne else 38a8cf78c7SLouis Dionne assert(spBytes.extent == sizeof(typename Span::element_type) * sp.extent); 39a8cf78c7SLouis Dionne 40a8cf78c7SLouis Dionne assert((void *) spBytes.data() == (void *) sp.data()); 41a8cf78c7SLouis Dionne assert(spBytes.size() == sp.size_bytes()); 42a8cf78c7SLouis Dionne } 43a8cf78c7SLouis Dionne 44a8cf78c7SLouis Dionne struct A{}; 45a8cf78c7SLouis Dionne int iArr2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 46a8cf78c7SLouis Dionne 47a8cf78c7SLouis Dionne int main(int, char**) 48a8cf78c7SLouis Dionne { 49a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int> ()); 50a8cf78c7SLouis Dionne testRuntimeSpan(std::span<long> ()); 51a8cf78c7SLouis Dionne testRuntimeSpan(std::span<double> ()); 52a8cf78c7SLouis Dionne testRuntimeSpan(std::span<A> ()); 53a8cf78c7SLouis Dionne testRuntimeSpan(std::span<std::string>()); 54a8cf78c7SLouis Dionne 55a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int, 0> ()); 56a8cf78c7SLouis Dionne testRuntimeSpan(std::span<long, 0> ()); 57a8cf78c7SLouis Dionne testRuntimeSpan(std::span<double, 0> ()); 58a8cf78c7SLouis Dionne testRuntimeSpan(std::span<A, 0> ()); 59a8cf78c7SLouis Dionne testRuntimeSpan(std::span<std::string, 0>()); 60a8cf78c7SLouis Dionne 61a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int>(iArr2, 1)); 62a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int>(iArr2, 2)); 63a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int>(iArr2, 3)); 64a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int>(iArr2, 4)); 65a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int>(iArr2, 5)); 66a8cf78c7SLouis Dionne 67a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int, 1>(iArr2 + 5, 1)); 68a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int, 2>(iArr2 + 4, 2)); 69a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int, 3>(iArr2 + 3, 3)); 70a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int, 4>(iArr2 + 2, 4)); 71a8cf78c7SLouis Dionne testRuntimeSpan(std::span<int, 5>(iArr2 + 1, 5)); 72a8cf78c7SLouis Dionne 73a8cf78c7SLouis Dionne std::string s; 74a8cf78c7SLouis Dionne testRuntimeSpan(std::span<std::string>(&s, (std::size_t) 0)); 75a8cf78c7SLouis Dionne testRuntimeSpan(std::span<std::string>(&s, 1)); 76a8cf78c7SLouis Dionne 77a8cf78c7SLouis Dionne return 0; 78a8cf78c7SLouis Dionne } 79