libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

data.pass.cpp (4886B)


      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 pointer data() const noexcept;
     15 //
     16 
     17 
     18 #include <span>
     19 #include <cassert>
     20 #include <string>
     21 
     22 #include "test_macros.h"
     23 
     24 
     25 template <typename Span>
     26 constexpr bool testConstexprSpan(Span sp, typename Span::pointer ptr)
     27 {
     28     ASSERT_NOEXCEPT(sp.data());
     29     return sp.data() == ptr;
     30 }
     31 
     32 
     33 template <typename Span>
     34 void testRuntimeSpan(Span sp, typename Span::pointer ptr)
     35 {
     36     ASSERT_NOEXCEPT(sp.data());
     37     assert(sp.data() == ptr);
     38 }
     39 
     40 struct A{};
     41 constexpr int iArr1[] = { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9};
     42           int iArr2[] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
     43 
     44 int main ()
     45 {
     46 
     47 //  dynamic size
     48     static_assert(testConstexprSpan(std::span<int>(), nullptr),         "");
     49     static_assert(testConstexprSpan(std::span<long>(), nullptr),        "");
     50     static_assert(testConstexprSpan(std::span<double>(), nullptr),      "");
     51     static_assert(testConstexprSpan(std::span<A>(), nullptr),           "");
     52     static_assert(testConstexprSpan(std::span<std::string>(), nullptr), "");
     53 
     54     static_assert(testConstexprSpan(std::span<const int>(iArr1, 1), iArr1), "");
     55     static_assert(testConstexprSpan(std::span<const int>(iArr1, 2), iArr1), "");
     56     static_assert(testConstexprSpan(std::span<const int>(iArr1, 3), iArr1), "");
     57     static_assert(testConstexprSpan(std::span<const int>(iArr1, 4), iArr1), "");
     58 
     59     static_assert(testConstexprSpan(std::span<const int>(iArr1 + 1, 1), iArr1 + 1), "");
     60     static_assert(testConstexprSpan(std::span<const int>(iArr1 + 2, 2), iArr1 + 2), "");
     61     static_assert(testConstexprSpan(std::span<const int>(iArr1 + 3, 3), iArr1 + 3), "");
     62     static_assert(testConstexprSpan(std::span<const int>(iArr1 + 4, 4), iArr1 + 4), "");
     63 
     64 //  static size
     65     static_assert(testConstexprSpan(std::span<int, 0>(), nullptr),         "");
     66     static_assert(testConstexprSpan(std::span<long, 0>(), nullptr),        "");
     67     static_assert(testConstexprSpan(std::span<double, 0>(), nullptr),      "");
     68     static_assert(testConstexprSpan(std::span<A, 0>(), nullptr),           "");
     69     static_assert(testConstexprSpan(std::span<std::string, 0>(), nullptr), "");
     70 
     71     static_assert(testConstexprSpan(std::span<const int, 1>(iArr1, 1), iArr1), "");
     72     static_assert(testConstexprSpan(std::span<const int, 2>(iArr1, 2), iArr1), "");
     73     static_assert(testConstexprSpan(std::span<const int, 3>(iArr1, 3), iArr1), "");
     74     static_assert(testConstexprSpan(std::span<const int, 4>(iArr1, 4), iArr1), "");
     75 
     76     static_assert(testConstexprSpan(std::span<const int, 1>(iArr1 + 1, 1), iArr1 + 1), "");
     77     static_assert(testConstexprSpan(std::span<const int, 2>(iArr1 + 2, 2), iArr1 + 2), "");
     78     static_assert(testConstexprSpan(std::span<const int, 3>(iArr1 + 3, 3), iArr1 + 3), "");
     79     static_assert(testConstexprSpan(std::span<const int, 4>(iArr1 + 4, 4), iArr1 + 4), "");
     80 
     81 
     82 //  dynamic size
     83     testRuntimeSpan(std::span<int>(), nullptr);
     84     testRuntimeSpan(std::span<long>(), nullptr);
     85     testRuntimeSpan(std::span<double>(), nullptr);
     86     testRuntimeSpan(std::span<A>(), nullptr);
     87     testRuntimeSpan(std::span<std::string>(), nullptr);
     88 
     89     testRuntimeSpan(std::span<int>(iArr2, 1), iArr2);
     90     testRuntimeSpan(std::span<int>(iArr2, 2), iArr2);
     91     testRuntimeSpan(std::span<int>(iArr2, 3), iArr2);
     92     testRuntimeSpan(std::span<int>(iArr2, 4), iArr2);
     93 
     94     testRuntimeSpan(std::span<int>(iArr2 + 1, 1), iArr2 + 1);
     95     testRuntimeSpan(std::span<int>(iArr2 + 2, 2), iArr2 + 2);
     96     testRuntimeSpan(std::span<int>(iArr2 + 3, 3), iArr2 + 3);
     97     testRuntimeSpan(std::span<int>(iArr2 + 4, 4), iArr2 + 4);
     98 
     99 //  static size
    100     testRuntimeSpan(std::span<int, 0>(), nullptr);
    101     testRuntimeSpan(std::span<long, 0>(), nullptr);
    102     testRuntimeSpan(std::span<double, 0>(), nullptr);
    103     testRuntimeSpan(std::span<A, 0>(), nullptr);
    104     testRuntimeSpan(std::span<std::string, 0>(), nullptr);
    105 
    106     testRuntimeSpan(std::span<int, 1>(iArr2, 1), iArr2);
    107     testRuntimeSpan(std::span<int, 2>(iArr2, 2), iArr2);
    108     testRuntimeSpan(std::span<int, 3>(iArr2, 3), iArr2);
    109     testRuntimeSpan(std::span<int, 4>(iArr2, 4), iArr2);
    110 
    111     testRuntimeSpan(std::span<int, 1>(iArr2 + 1, 1), iArr2 + 1);
    112     testRuntimeSpan(std::span<int, 2>(iArr2 + 2, 2), iArr2 + 2);
    113     testRuntimeSpan(std::span<int, 3>(iArr2 + 3, 3), iArr2 + 3);
    114     testRuntimeSpan(std::span<int, 4>(iArr2 + 4, 4), iArr2 + 4);
    115 
    116 
    117     std::string s;
    118     testRuntimeSpan(std::span<std::string>(&s, 1), &s);
    119     testRuntimeSpan(std::span<std::string, 1>(&s, 1), &s);
    120 
    121 }