brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · dcbf0fb Raw
277 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//  constexpr span& operator=(const span& other) noexcept = default;13 14#include <span>15#include <cassert>16#include <iterator>17#include <string>18#include <utility>19 20#include "test_macros.h"21 22template <typename T>23constexpr bool doAssign(T lhs, T rhs) {24  ASSERT_NOEXCEPT(std::declval<T&>() = rhs);25  lhs = rhs;26  return lhs.data() == rhs.data() && lhs.size() == rhs.size();27}28 29struct A {};30 31constexpr int carr1[] = {1, 2, 3, 4};32constexpr int carr2[] = {3, 4, 5};33constexpr int carr3[] = {7, 8};34int arr[]             = {5, 6, 7, 9};35std::string strs[]    = {"ABC", "DEF", "GHI"};36 37int main(int, char**) {38  //  constexpr dynamically sized assignment39  {40    //  On systems where 'ptrdiff_t' is a synonym for 'int',41    //  the call span(ptr, 0) selects the (pointer, size_type) constructor.42    //  On systems where 'ptrdiff_t' is NOT a synonym for 'int',43    //  it is ambiguous, because of 0 also being convertible to a null pointer44    //  and so the compiler can't choose between:45    //      span(pointer, size_type)46    //  and span(pointer, pointer)47    //  We cast zero to std::ptrdiff_t to remove that ambiguity.48    //  Example:49    //      On darwin x86_64, ptrdiff_t is the same as long int.50    //      On darwin i386, ptrdiff_t is the same as int.51    constexpr std::span<const int> spans[] = {52        {},53        {carr1, static_cast<std::size_t>(0)},54        {carr1, 1U},55        {carr1, 2U},56        {carr1, 3U},57        {carr1, 4U},58        {carr2, static_cast<std::size_t>(0)},59        {carr2, 1U},60        {carr2, 2U},61        {carr2, 3U},62        {carr3, static_cast<std::size_t>(0)},63        {carr3, 1U},64        {carr3, 2U}};65 66    static_assert(std::size(spans) == 13, "");67 68    //  No for loops in constexpr land :-(69    static_assert(doAssign(spans[0], spans[0]), "");70    static_assert(doAssign(spans[0], spans[1]), "");71    static_assert(doAssign(spans[0], spans[2]), "");72    static_assert(doAssign(spans[0], spans[3]), "");73    static_assert(doAssign(spans[0], spans[4]), "");74    static_assert(doAssign(spans[0], spans[5]), "");75    static_assert(doAssign(spans[0], spans[6]), "");76    static_assert(doAssign(spans[0], spans[7]), "");77    static_assert(doAssign(spans[0], spans[8]), "");78    static_assert(doAssign(spans[0], spans[9]), "");79    static_assert(doAssign(spans[0], spans[10]), "");80    static_assert(doAssign(spans[0], spans[11]), "");81    static_assert(doAssign(spans[0], spans[12]), "");82 83    static_assert(doAssign(spans[1], spans[1]), "");84    static_assert(doAssign(spans[1], spans[2]), "");85    static_assert(doAssign(spans[1], spans[3]), "");86    static_assert(doAssign(spans[1], spans[4]), "");87    static_assert(doAssign(spans[1], spans[5]), "");88    static_assert(doAssign(spans[1], spans[6]), "");89    static_assert(doAssign(spans[1], spans[7]), "");90    static_assert(doAssign(spans[1], spans[8]), "");91    static_assert(doAssign(spans[1], spans[9]), "");92    static_assert(doAssign(spans[1], spans[10]), "");93    static_assert(doAssign(spans[1], spans[11]), "");94    static_assert(doAssign(spans[1], spans[12]), "");95 96    static_assert(doAssign(spans[2], spans[2]), "");97    static_assert(doAssign(spans[2], spans[3]), "");98    static_assert(doAssign(spans[2], spans[4]), "");99    static_assert(doAssign(spans[2], spans[5]), "");100    static_assert(doAssign(spans[2], spans[6]), "");101    static_assert(doAssign(spans[2], spans[7]), "");102    static_assert(doAssign(spans[2], spans[8]), "");103    static_assert(doAssign(spans[2], spans[9]), "");104    static_assert(doAssign(spans[2], spans[10]), "");105    static_assert(doAssign(spans[2], spans[11]), "");106    static_assert(doAssign(spans[2], spans[12]), "");107 108    static_assert(doAssign(spans[3], spans[3]), "");109    static_assert(doAssign(spans[3], spans[4]), "");110    static_assert(doAssign(spans[3], spans[4]), "");111    static_assert(doAssign(spans[3], spans[4]), "");112    static_assert(doAssign(spans[3], spans[4]), "");113    static_assert(doAssign(spans[3], spans[4]), "");114    static_assert(doAssign(spans[3], spans[4]), "");115    static_assert(doAssign(spans[3], spans[4]), "");116    static_assert(doAssign(spans[3], spans[4]), "");117    static_assert(doAssign(spans[3], spans[10]), "");118    static_assert(doAssign(spans[3], spans[11]), "");119    static_assert(doAssign(spans[3], spans[12]), "");120 121    static_assert(doAssign(spans[4], spans[4]), "");122    static_assert(doAssign(spans[4], spans[5]), "");123    static_assert(doAssign(spans[4], spans[6]), "");124    static_assert(doAssign(spans[4], spans[7]), "");125    static_assert(doAssign(spans[4], spans[8]), "");126    static_assert(doAssign(spans[4], spans[9]), "");127    static_assert(doAssign(spans[4], spans[10]), "");128    static_assert(doAssign(spans[4], spans[11]), "");129    static_assert(doAssign(spans[4], spans[12]), "");130 131    static_assert(doAssign(spans[5], spans[5]), "");132    static_assert(doAssign(spans[5], spans[6]), "");133    static_assert(doAssign(spans[5], spans[7]), "");134    static_assert(doAssign(spans[5], spans[8]), "");135    static_assert(doAssign(spans[5], spans[9]), "");136    static_assert(doAssign(spans[5], spans[10]), "");137    static_assert(doAssign(spans[5], spans[11]), "");138    static_assert(doAssign(spans[5], spans[12]), "");139 140    static_assert(doAssign(spans[6], spans[6]), "");141    static_assert(doAssign(spans[6], spans[7]), "");142    static_assert(doAssign(spans[6], spans[8]), "");143    static_assert(doAssign(spans[6], spans[9]), "");144    static_assert(doAssign(spans[6], spans[10]), "");145    static_assert(doAssign(spans[6], spans[11]), "");146    static_assert(doAssign(spans[6], spans[12]), "");147 148    static_assert(doAssign(spans[7], spans[7]), "");149    static_assert(doAssign(spans[7], spans[8]), "");150    static_assert(doAssign(spans[7], spans[9]), "");151    static_assert(doAssign(spans[7], spans[10]), "");152    static_assert(doAssign(spans[7], spans[11]), "");153    static_assert(doAssign(spans[7], spans[12]), "");154 155    static_assert(doAssign(spans[8], spans[8]), "");156    static_assert(doAssign(spans[8], spans[9]), "");157    static_assert(doAssign(spans[8], spans[10]), "");158    static_assert(doAssign(spans[8], spans[11]), "");159    static_assert(doAssign(spans[8], spans[12]), "");160 161    static_assert(doAssign(spans[9], spans[9]), "");162    static_assert(doAssign(spans[9], spans[10]), "");163    static_assert(doAssign(spans[9], spans[11]), "");164    static_assert(doAssign(spans[9], spans[12]), "");165 166    static_assert(doAssign(spans[10], spans[10]), "");167    static_assert(doAssign(spans[10], spans[11]), "");168    static_assert(doAssign(spans[10], spans[12]), "");169 170    static_assert(doAssign(spans[11], spans[11]), "");171    static_assert(doAssign(spans[11], spans[12]), "");172 173    static_assert(doAssign(spans[12], spans[12]), "");174 175    //      for (size_t i = 0; i < std::size(spans); ++i)176    //          for (size_t j = i; j < std::size(spans); ++j)177    //              static_assert(doAssign(spans[i], spans[j]), "");178  }179 180  //  constexpr statically sized assignment181  {182    using spanType             = std::span<const int, 2>;183    constexpr spanType spans[] = {184        spanType{carr1, 2},185        spanType{carr1 + 1, 2},186        spanType{carr1 + 2, 2},187        spanType{carr2, 2},188        spanType{carr2 + 1, 2},189        spanType{carr3, 2}};190 191    static_assert(std::size(spans) == 6, "");192 193    //  No for loops in constexpr land :-(194    static_assert(doAssign(spans[0], spans[0]), "");195    static_assert(doAssign(spans[0], spans[1]), "");196    static_assert(doAssign(spans[0], spans[2]), "");197    static_assert(doAssign(spans[0], spans[3]), "");198    static_assert(doAssign(spans[0], spans[4]), "");199    static_assert(doAssign(spans[0], spans[5]), "");200 201    static_assert(doAssign(spans[1], spans[1]), "");202    static_assert(doAssign(spans[1], spans[2]), "");203    static_assert(doAssign(spans[1], spans[3]), "");204    static_assert(doAssign(spans[1], spans[4]), "");205    static_assert(doAssign(spans[1], spans[5]), "");206 207    static_assert(doAssign(spans[2], spans[2]), "");208    static_assert(doAssign(spans[2], spans[3]), "");209    static_assert(doAssign(spans[2], spans[4]), "");210    static_assert(doAssign(spans[2], spans[5]), "");211 212    static_assert(doAssign(spans[3], spans[3]), "");213    static_assert(doAssign(spans[3], spans[4]), "");214    static_assert(doAssign(spans[3], spans[5]), "");215 216    static_assert(doAssign(spans[4], spans[4]), "");217    static_assert(doAssign(spans[4], spans[5]), "");218 219    static_assert(doAssign(spans[5], spans[5]), "");220 221    //      for (size_t i = 0; i < std::size(spans); ++i)222    //          for (size_t j = i; j < std::size(spans); ++j)223    //              static_assert(doAssign(spans[i], spans[j]), "");224  }225 226  //  dynamically sized assignment227  {228    std::span<int> spans[] = {229        {}, {arr, arr + 1}, {arr, arr + 2}, {arr, arr + 3}, {arr + 1, arr + 3} // same size as s2230    };231 232    for (std::size_t i = 0; i < std::size(spans); ++i)233      for (std::size_t j = i; j < std::size(spans); ++j)234        assert((doAssign(spans[i], spans[j])));235  }236 237  //  statically sized assignment238  {239    using spanType   = std::span<int, 2>;240    spanType spans[] = {spanType{arr, arr + 2}, spanType{arr + 1, arr + 3}, spanType{arr + 2, arr + 4}};241 242    for (std::size_t i = 0; i < std::size(spans); ++i)243      for (std::size_t j = i; j < std::size(spans); ++j)244        assert((doAssign(spans[i], spans[j])));245  }246 247  //  dynamically sized assignment248  {249    std::span<std::string> spans[] = {250        {strs, strs},251        {strs, strs + 1},252        {strs, strs + 2},253        {strs, strs + 3},254        {strs + 1, strs + 1},255        {strs + 1, strs + 2},256        {strs + 1, strs + 3},257        {strs + 2, strs + 2},258        {strs + 2, strs + 3},259        {strs + 3, strs + 3}};260 261    for (std::size_t i = 0; i < std::size(spans); ++i)262      for (std::size_t j = i; j < std::size(spans); ++j)263        assert((doAssign(spans[i], spans[j])));264  }265 266  {267    using spanType   = std::span<std::string, 1>;268    spanType spans[] = {spanType{strs, strs + 1}, spanType{strs + 1, strs + 2}, spanType{strs + 2, strs + 3}};269 270    for (std::size_t i = 0; i < std::size(spans); ++i)271      for (std::size_t j = i; j < std::size(spans); ++j)272        assert((doAssign(spans[i], spans[j])));273  }274 275  return 0;276}277