Home | History | Annotate | Download | only in span.cons
      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(pointer first, pointer last);
     15 // Requires: [first, last) shall be a valid range.
     16 //   If extent is not equal to dynamic_extent, then last - first shall be equal to extent.
     17 //
     18 
     19 #include <span>
     20 #include <cassert>
     21 #include <string>
     22 
     23 #include "test_macros.h"
     24 
     25 void checkCV()
     26 {
     27                    int   arr[] = {1,2,3};
     28     const          int  carr[] = {4,5,6};
     29           volatile int  varr[] = {7,8,9};
     30     const volatile int cvarr[] = {1,3,5};
     31 
     32 //  Types the same (dynamic sized)
     33     {
     34     std::span<               int> s1{  arr,   arr + 3}; // a span<               int> pointing at int.
     35     std::span<const          int> s2{ carr,  carr + 3}; // a span<const          int> pointing at const int.
     36     std::span<      volatile int> s3{ varr,  varr + 3}; // a span<      volatile int> pointing at volatile int.
     37     std::span<const volatile int> s4{cvarr, cvarr + 3}; // a span<const volatile int> pointing at const volatile int.
     38     assert(s1.size() + s2.size() + s3.size() + s4.size() == 12);
     39     }
     40 
     41 //  Types the same (static sized)
     42     {
     43     std::span<               int,3> s1{  arr,   arr + 3};   // a span<               int> pointing at int.
     44     std::span<const          int,3> s2{ carr,  carr + 3};   // a span<const          int> pointing at const int.
     45     std::span<      volatile int,3> s3{ varr,  varr + 3};   // a span<      volatile int> pointing at volatile int.
     46     std::span<const volatile int,3> s4{cvarr, cvarr + 3};   // a span<const volatile int> pointing at const volatile int.
     47     assert(s1.size() + s2.size() + s3.size() + s4.size() == 12);
     48     }
     49 
     50 
     51 //  types different (dynamic sized)
     52     {
     53     std::span<const          int> s1{ arr,  arr + 3};       // a span<const          int> pointing at int.
     54     std::span<      volatile int> s2{ arr,  arr + 3};       // a span<      volatile int> pointing at int.
     55     std::span<      volatile int> s3{ arr,  arr + 3};       // a span<      volatile int> pointing at const int.
     56     std::span<const volatile int> s4{ arr,  arr + 3};       // a span<const volatile int> pointing at int.
     57     std::span<const volatile int> s5{carr, carr + 3};       // a span<const volatile int> pointing at const int.
     58     std::span<const volatile int> s6{varr, varr + 3};       // a span<const volatile int> pointing at volatile int.
     59     assert(s1.size() + s2.size() + s3.size() + s4.size() + s5.size() + s6.size() == 18);
     60     }
     61 
     62 //  types different (static sized)
     63     {
     64     std::span<const          int,3> s1{ arr,  arr + 3}; // a span<const          int> pointing at int.
     65     std::span<      volatile int,3> s2{ arr,  arr + 3}; // a span<      volatile int> pointing at int.
     66     std::span<      volatile int,3> s3{ arr,  arr + 3}; // a span<      volatile int> pointing at const int.
     67     std::span<const volatile int,3> s4{ arr,  arr + 3}; // a span<const volatile int> pointing at int.
     68     std::span<const volatile int,3> s5{carr, carr + 3}; // a span<const volatile int> pointing at const int.
     69     std::span<const volatile int,3> s6{varr, varr + 3}; // a span<const volatile int> pointing at volatile int.
     70     assert(s1.size() + s2.size() + s3.size() + s4.size() + s5.size() + s6.size() == 18);
     71     }
     72 }
     73 
     74 
     75 template <typename T>
     76 constexpr bool testConstexprSpan()
     77 {
     78     constexpr T val[2] = {};
     79     std::span<const T>   s1{val, val+2};
     80     std::span<const T,2> s2{val, val+2};
     81     return
     82         s1.data() == &val[0] && s1.size() == 2
     83     &&  s2.data() == &val[0] && s2.size() == 2;
     84 }
     85 
     86 
     87 template <typename T>
     88 void testRuntimeSpan()
     89 {
     90     T val[2] = {};
     91     std::span<T>   s1{val, val+2};
     92     std::span<T,2> s2{val, val+2};
     93     assert(s1.data() == &val[0] && s1.size() == 2);
     94     assert(s2.data() == &val[0] && s2.size() == 2);
     95 }
     96 
     97 struct A{};
     98 
     99 int main ()
    100 {
    101     static_assert(testConstexprSpan<int>(),    "");
    102     static_assert(testConstexprSpan<long>(),   "");
    103     static_assert(testConstexprSpan<double>(), "");
    104     static_assert(testConstexprSpan<A>(),      "");
    105 
    106     testRuntimeSpan<int>();
    107     testRuntimeSpan<long>();
    108     testRuntimeSpan<double>();
    109     testRuntimeSpan<std::string>();
    110     testRuntimeSpan<A>();
    111 
    112     checkCV();
    113 }
    114