Home | History | Annotate | Download | only in vector.cons
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <vector>
     11 
     12 // template <class InputIter> vector(InputIter first, InputIter last,
     13 //                                   const allocator_type& a);
     14 
     15 #include <vector>
     16 #include <cassert>
     17 #include <cstddef>
     18 
     19 #include "test_macros.h"
     20 #include "test_iterators.h"
     21 #include "test_allocator.h"
     22 #include "min_allocator.h"
     23 #include "asan_testing.h"
     24 #if TEST_STD_VER >= 11
     25 #include "emplace_constructible.h"
     26 #include "container_test_types.h"
     27 #endif
     28 
     29 template <class C, class Iterator, class A>
     30 void test(Iterator first, Iterator last, const A& a) {
     31   C c(first, last, a);
     32   LIBCPP_ASSERT(c.__invariants());
     33   assert(c.size() == static_cast<std::size_t>(std::distance(first, last)));
     34   LIBCPP_ASSERT(is_contiguous_container_asan_correct(c));
     35   for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e;
     36        ++i, ++first)
     37     assert(*i == *first);
     38 }
     39 
     40 #if TEST_STD_VER >= 11
     41 
     42 template <class T>
     43 struct implicit_conv_allocator : min_allocator<T> {
     44   implicit_conv_allocator(void*) {}
     45   implicit_conv_allocator(const implicit_conv_allocator&) = default;
     46 
     47   template <class U>
     48   implicit_conv_allocator(implicit_conv_allocator<U>) {}
     49 };
     50 
     51 #endif
     52 
     53 void basic_tests() {
     54   {
     55     int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
     56     int* an = a + sizeof(a) / sizeof(a[0]);
     57     std::allocator<int> alloc;
     58     test<std::vector<int> >(input_iterator<const int*>(a),
     59                             input_iterator<const int*>(an), alloc);
     60     test<std::vector<int> >(forward_iterator<const int*>(a),
     61                             forward_iterator<const int*>(an), alloc);
     62     test<std::vector<int> >(bidirectional_iterator<const int*>(a),
     63                             bidirectional_iterator<const int*>(an), alloc);
     64     test<std::vector<int> >(random_access_iterator<const int*>(a),
     65                             random_access_iterator<const int*>(an), alloc);
     66     test<std::vector<int> >(a, an, alloc);
     67   }
     68 #if TEST_STD_VER >= 11
     69   {
     70     int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
     71     int* an = a + sizeof(a) / sizeof(a[0]);
     72     min_allocator<int> alloc;
     73     test<std::vector<int, min_allocator<int> > >(
     74         input_iterator<const int*>(a), input_iterator<const int*>(an), alloc);
     75     test<std::vector<int, min_allocator<int> > >(
     76         forward_iterator<const int*>(a), forward_iterator<const int*>(an),
     77         alloc);
     78     test<std::vector<int, min_allocator<int> > >(
     79         bidirectional_iterator<const int*>(a),
     80         bidirectional_iterator<const int*>(an), alloc);
     81     test<std::vector<int, min_allocator<int> > >(
     82         random_access_iterator<const int*>(a),
     83         random_access_iterator<const int*>(an), alloc);
     84     test<std::vector<int, min_allocator<int> > >(a, an, alloc);
     85     test<std::vector<int, implicit_conv_allocator<int> > >(a, an, nullptr);
     86   }
     87 #endif
     88 }
     89 
     90 void emplaceable_concept_tests() {
     91 #if TEST_STD_VER >= 11
     92   int arr1[] = {42};
     93   int arr2[] = {1, 101, 42};
     94   {
     95     using T = EmplaceConstructible<int>;
     96     using It = forward_iterator<int*>;
     97     using Alloc = std::allocator<T>;
     98     Alloc a;
     99     {
    100       std::vector<T> v(It(arr1), It(std::end(arr1)), a);
    101       assert(v[0].value == 42);
    102     }
    103     {
    104       std::vector<T> v(It(arr2), It(std::end(arr2)), a);
    105       assert(v[0].value == 1);
    106       assert(v[1].value == 101);
    107       assert(v[2].value == 42);
    108     }
    109   }
    110   {
    111     using T = EmplaceConstructibleAndMoveInsertable<int>;
    112     using It = input_iterator<int*>;
    113     using Alloc = std::allocator<T>;
    114     Alloc a;
    115     {
    116       std::vector<T> v(It(arr1), It(std::end(arr1)), a);
    117       assert(v[0].copied == 0);
    118       assert(v[0].value == 42);
    119     }
    120     {
    121       std::vector<T> v(It(arr2), It(std::end(arr2)), a);
    122       assert(v[0].value == 1);
    123       assert(v[1].value == 101);
    124       assert(v[2].copied == 0);
    125       assert(v[2].value == 42);
    126     }
    127   }
    128 #endif
    129 }
    130 
    131 void test_ctor_under_alloc() {
    132 #if TEST_STD_VER >= 11
    133   int arr1[] = {42};
    134   int arr2[] = {1, 101, 42};
    135   {
    136     using C = TCT::vector<>;
    137     using T = typename C::value_type;
    138     using It = forward_iterator<int*>;
    139     using Alloc = typename C::allocator_type;
    140     Alloc a;
    141     {
    142       ExpectConstructGuard<int&> G(1);
    143       C v(It(arr1), It(std::end(arr1)), a);
    144     }
    145     {
    146       ExpectConstructGuard<int&> G(3);
    147       C v(It(arr2), It(std::end(arr2)), a);
    148     }
    149   }
    150   {
    151     using C = TCT::vector<>;
    152     using T = typename C::value_type;
    153     using It = input_iterator<int*>;
    154     using Alloc = typename C::allocator_type;
    155     Alloc a;
    156     {
    157       ExpectConstructGuard<int&> G(1);
    158       C v(It(arr1), It(std::end(arr1)), a);
    159     }
    160     {
    161       //ExpectConstructGuard<int&> G(3);
    162       //C v(It(arr2), It(std::end(arr2)), a);
    163     }
    164   }
    165 #endif
    166 }
    167 
    168 int main() {
    169   basic_tests();
    170   emplaceable_concept_tests(); // See PR34898
    171   test_ctor_under_alloc();
    172 }
    173