• 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 //  constexpr span(const span& other) noexcept = default;
15 
16 #include <span>
17 #include <cassert>
18 #include <string>
19 
20 #include "test_macros.h"
21 
22 template <typename T>
doCopy(const T & rhs)23 constexpr bool doCopy(const T &rhs)
24 {
25     ASSERT_NOEXCEPT(T{rhs});
26     T lhs{rhs};
27     return lhs.data() == rhs.data()
28      &&    lhs.size() == rhs.size();
29 }
30 
31 struct A{};
32 
33 template <typename T>
testCV()34 void testCV ()
35 {
36     int  arr[] = {1,2,3};
37     assert((doCopy(std::span<T>  ()          )));
38     assert((doCopy(std::span<T,0>()          )));
39     assert((doCopy(std::span<T>  (&arr[0], 1))));
40     assert((doCopy(std::span<T,1>(&arr[0], 1))));
41     assert((doCopy(std::span<T>  (&arr[0], 2))));
42     assert((doCopy(std::span<T,2>(&arr[0], 2))));
43 }
44 
45 
main()46 int main ()
47 {
48     constexpr int carr[] = {1,2,3};
49 
50     static_assert(doCopy(std::span<      int>  ()),            "");
51     static_assert(doCopy(std::span<      int,0>()),            "");
52     static_assert(doCopy(std::span<const int>  (&carr[0], 1)), "");
53     static_assert(doCopy(std::span<const int,1>(&carr[0], 1)), "");
54     static_assert(doCopy(std::span<const int>  (&carr[0], 2)), "");
55     static_assert(doCopy(std::span<const int,2>(&carr[0], 2)), "");
56 
57     static_assert(doCopy(std::span<long>()),   "");
58     static_assert(doCopy(std::span<double>()), "");
59     static_assert(doCopy(std::span<A>()),      "");
60 
61     std::string s;
62     assert(doCopy(std::span<std::string>   ()     ));
63     assert(doCopy(std::span<std::string, 0>()     ));
64     assert(doCopy(std::span<std::string>   (&s, 1)));
65     assert(doCopy(std::span<std::string, 1>(&s, 1)));
66 
67     testCV<               int>();
68     testCV<const          int>();
69     testCV<      volatile int>();
70     testCV<const volatile int>();
71 }
72