brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 2408369 Raw
173 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 9// <vector>10// UNSUPPORTED: c++03, c++11, c++1411 12// template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>13//    vector(InputIterator, InputIterator, Allocator = Allocator())14//    -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>;15//16// template<ranges::input_range R, class Allocator = allocator<ranges::range_value_t<R>>>17//   vector(from_range_t, R&&, Allocator = Allocator())18//     -> vector<ranges::range_value_t<R>, Allocator>; // C++2319 20#include <algorithm>21#include <array>22#include <cassert>23#include <climits> // INT_MAX24#include <cstddef>25#include <iterator>26#include <type_traits>27#include <vector>28 29#include "deduction_guides_sfinae_checks.h"30#include "test_macros.h"31#include "test_iterators.h"32#include "test_allocator.h"33 34struct A {};35 36TEST_CONSTEXPR_CXX20 bool tests() {37  //  Test the explicit deduction guides38  {39    const int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};40    std::vector vec(std::begin(arr), std::end(arr));41 42    static_assert(std::is_same_v<decltype(vec), std::vector<int>>, "");43    assert(std::equal(vec.begin(), vec.end(), std::begin(arr), std::end(arr)));44  }45 46  {47    const long arr[] = {INT_MAX, 1L, 2L, 3L};48    std::vector vec(std::begin(arr), std::end(arr), std::allocator<long>());49    static_assert(std::is_same_v<decltype(vec)::value_type, long>, "");50    assert(vec.size() == 4);51    assert(vec[0] == INT_MAX);52    assert(vec[1] == 1L);53    assert(vec[2] == 2L);54  }55 56  //  Test the implicit deduction guides57 58  {59    //  We don't expect this one to work.60    //  std::vector vec(std::allocator<int>()); // vector (allocator &)61  }62 63  {64    std::vector vec(1, A{}); // vector (size_type, T)65    static_assert(std::is_same_v<decltype(vec)::value_type, A>, "");66    static_assert(std::is_same_v<decltype(vec)::allocator_type, std::allocator<A>>, "");67    assert(vec.size() == 1);68  }69 70  {71    std::vector vec(1, A{}, test_allocator<A>()); // vector (size_type, T, allocator)72    static_assert(std::is_same_v<decltype(vec)::value_type, A>, "");73    static_assert(std::is_same_v<decltype(vec)::allocator_type, test_allocator<A>>, "");74    assert(vec.size() == 1);75  }76 77  {78    std::vector vec{1U, 2U, 3U, 4U, 5U}; // vector(initializer-list)79    static_assert(std::is_same_v<decltype(vec)::value_type, unsigned>, "");80    assert(vec.size() == 5);81    assert(vec[2] == 3U);82  }83 84  {85    std::vector vec({1.0, 2.0, 3.0, 4.0}, test_allocator<double>()); // vector(initializer-list, allocator)86    static_assert(std::is_same_v<decltype(vec)::value_type, double>, "");87    static_assert(std::is_same_v<decltype(vec)::allocator_type, test_allocator<double>>, "");88    assert(vec.size() == 4);89    assert(vec[3] == 4.0);90  }91 92  {93    std::vector<long double> source;94    std::vector vec(source); // vector(vector &)95    static_assert(std::is_same_v<decltype(vec)::value_type, long double>, "");96    static_assert(std::is_same_v<decltype(vec)::allocator_type, std::allocator<long double>>, "");97    assert(vec.size() == 0);98  }99 100#if TEST_STD_VER >= 23101  {102    {103      std::vector c(std::from_range, std::array<int, 0>());104      static_assert(std::is_same_v<decltype(c), std::vector<int>>);105    }106 107    {108      using Alloc = test_allocator<int>;109      std::vector c(std::from_range, std::array<int, 0>(), Alloc());110      static_assert(std::is_same_v<decltype(c), std::vector<int, Alloc>>);111    }112  }113#endif114 115  //  A couple of vector<bool> tests, too!116  {117    std::vector vec(3, true); // vector(initializer-list)118    static_assert(std::is_same_v<decltype(vec)::value_type, bool>, "");119    static_assert(std::is_same_v<decltype(vec)::allocator_type, std::allocator<bool>>, "");120    assert(vec.size() == 3);121    assert(vec[0] && vec[1] && vec[2]);122  }123 124  {125    std::vector<bool> source;126    std::vector vec(source); // vector(vector &)127    static_assert(std::is_same_v<decltype(vec)::value_type, bool>, "");128    static_assert(std::is_same_v<decltype(vec)::allocator_type, std::allocator<bool>>, "");129    assert(vec.size() == 0);130  }131 132  {133    typedef test_allocator<short> Alloc;134    typedef test_allocator<int> ConvertibleToAlloc;135 136    {137      std::vector<short, Alloc> source;138      std::vector vec(source, Alloc(2));139      static_assert(std::is_same_v<decltype(vec), decltype(source)>);140    }141 142    {143      std::vector<short, Alloc> source;144      std::vector vec(source, ConvertibleToAlloc(2));145      static_assert(std::is_same_v<decltype(vec), decltype(source)>);146    }147 148    {149      std::vector<short, Alloc> source;150      std::vector vec(std::move(source), Alloc(2));151      static_assert(std::is_same_v<decltype(vec), decltype(source)>);152    }153 154    {155      std::vector<short, Alloc> source;156      std::vector vec(std::move(source), ConvertibleToAlloc(2));157      static_assert(std::is_same_v<decltype(vec), decltype(source)>);158    }159  }160 161  SequenceContainerDeductionGuidesSfinaeAway<std::vector, std::vector<int>>();162 163  return true;164}165 166int main(int, char**) {167  tests();168#if TEST_STD_VER > 17169  static_assert(tests());170#endif171  return 0;172}173