• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // -*- C++ -*-
2 //===------------------------------ span ---------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===---------------------------------------------------------------------===//
10 // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
11 
12 // <span>
13 
14 // template <class ElementType, ptrdiff_t Extent>
15 //     span<byte,
16 //          Extent == dynamic_extent
17 //              ? dynamic_extent
18 //              : static_cast<ptrdiff_t>(sizeof(ElementType)) * Extent>
19 //     as_writeable_bytes(span<ElementType, Extent> s) noexcept;
20 
21 
22 #include <span>
23 #include <cassert>
24 #include <string>
25 
26 #include "test_macros.h"
27 
28 template<typename Span>
testRuntimeSpan(Span sp)29 void testRuntimeSpan(Span sp)
30 {
31     ASSERT_NOEXCEPT(std::as_writeable_bytes(sp));
32 
33     auto spBytes = std::as_writeable_bytes(sp);
34     using SB = decltype(spBytes);
35     ASSERT_SAME_TYPE(std::byte, typename SB::element_type);
36 
37     if (sp.extent == std::dynamic_extent)
38         assert(spBytes.extent == std::dynamic_extent);
39     else
40         assert(spBytes.extent == static_cast<std::ptrdiff_t>(sizeof(typename Span::element_type)) * sp.extent);
41 
42     assert(static_cast<void*>(spBytes.data()) == static_cast<void*>(sp.data()));
43     assert(spBytes.size() == sp.size_bytes());
44 }
45 
46 struct A{};
47 int iArr2[] = { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9};
48 
main()49 int main ()
50 {
51     testRuntimeSpan(std::span<int>        ());
52     testRuntimeSpan(std::span<long>       ());
53     testRuntimeSpan(std::span<double>     ());
54     testRuntimeSpan(std::span<A>          ());
55     testRuntimeSpan(std::span<std::string>());
56 
57     testRuntimeSpan(std::span<int, 0>        ());
58     testRuntimeSpan(std::span<long, 0>       ());
59     testRuntimeSpan(std::span<double, 0>     ());
60     testRuntimeSpan(std::span<A, 0>          ());
61     testRuntimeSpan(std::span<std::string, 0>());
62 
63     testRuntimeSpan(std::span<int>(iArr2, 1));
64     testRuntimeSpan(std::span<int>(iArr2, 2));
65     testRuntimeSpan(std::span<int>(iArr2, 3));
66     testRuntimeSpan(std::span<int>(iArr2, 4));
67     testRuntimeSpan(std::span<int>(iArr2, 5));
68 
69     testRuntimeSpan(std::span<int, 1>(iArr2 + 5, 1));
70     testRuntimeSpan(std::span<int, 2>(iArr2 + 4, 2));
71     testRuntimeSpan(std::span<int, 3>(iArr2 + 3, 3));
72     testRuntimeSpan(std::span<int, 4>(iArr2 + 2, 4));
73     testRuntimeSpan(std::span<int, 5>(iArr2 + 1, 5));
74 
75     std::string s;
76     testRuntimeSpan(std::span<std::string>(&s, (std::ptrdiff_t) 0));
77     testRuntimeSpan(std::span<std::string>(&s, 1));
78 }
79