brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 28dda86 Raw
125 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8// UNSUPPORTED: c++03, c++11, c++14, c++179 10// <span>11 12//   template<class It, class EndOrSize>13//     span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<_It>>>;14//15//   template<class T, size_t N>16//     span(T (&)[N]) -> span<T, N>;17//18//   template<class T, size_t N>19//     span(array<T, N>&) -> span<T, N>;20//21//   template<class T, size_t N>22//     span(const array<T, N>&) -> span<const T, N>;23//24//   template<class R>25//     span(R&&) -> span<remove_reference_t<ranges::range_reference_t<R>>>;26 27#include <span>28#include <array>29#include <cassert>30#include <iterator>31#include <memory>32#include <string>33#include <type_traits>34 35#include "test_macros.h"36 37void test_iterator_sentinel() {38  int arr[] = {1, 2, 3};39  {40    std::span s{std::begin(arr), std::end(arr)};41    ASSERT_SAME_TYPE(decltype(s), std::span<int>);42    assert(s.size() == std::size(arr));43    assert(s.data() == std::data(arr));44  }45  {46    std::span s{std::begin(arr), 3};47    ASSERT_SAME_TYPE(decltype(s), std::span<int>);48    assert(s.size() == std::size(arr));49    assert(s.data() == std::data(arr));50  }51 52#if TEST_STD_VER >= 2653  // P3029R1: deduction from `integral_constant`54  {55    std::span s{std::begin(arr), std::integral_constant<size_t, 3>{}};56    ASSERT_SAME_TYPE(decltype(s), std::span<int, 3>);57    assert(s.size() == std::size(arr));58    assert(s.data() == std::data(arr));59  }60#endif61}62 63void test_c_array() {64  {65    int arr[] = {1, 2, 3};66    std::span s{arr};67    ASSERT_SAME_TYPE(decltype(s), std::span<int, 3>);68    assert(s.size() == std::size(arr));69    assert(s.data() == std::data(arr));70  }71 72  {73    const int arr[] = {1, 2, 3};74    std::span s{arr};75    ASSERT_SAME_TYPE(decltype(s), std::span<const int, 3>);76    assert(s.size() == std::size(arr));77    assert(s.data() == std::data(arr));78  }79}80 81void test_std_array() {82  {83    std::array<double, 4> arr = {1.0, 2.0, 3.0, 4.0};84    std::span s{arr};85    ASSERT_SAME_TYPE(decltype(s), std::span<double, 4>);86    assert(s.size() == arr.size());87    assert(s.data() == arr.data());88  }89 90  {91    const std::array<long, 5> arr = {4, 5, 6, 7, 8};92    std::span s{arr};93    ASSERT_SAME_TYPE(decltype(s), std::span<const long, 5>);94    assert(s.size() == arr.size());95    assert(s.data() == arr.data());96  }97}98 99void test_range_std_container() {100  {101    std::string str{"ABCDE"};102    std::span s{str};103    ASSERT_SAME_TYPE(decltype(s), std::span<char>);104    assert(s.size() == str.size());105    assert(s.data() == str.data());106  }107 108  {109    const std::string str{"QWERTYUIOP"};110    std::span s{str};111    ASSERT_SAME_TYPE(decltype(s), std::span<const char>);112    assert(s.size() == str.size());113    assert(s.data() == str.data());114  }115}116 117int main(int, char**) {118  test_iterator_sentinel();119  test_c_array();120  test_std_array();121  test_range_std_container();122 123  return 0;124}125