xref: /llvm-project/libcxx/test/std/containers/views/views.span/span.objectrep/as_bytes.pass.cpp (revision e99c4906e44ae3f921fa05356909d006cda8d954)
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