brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 17967ff Raw
87 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// vector<bool>11 12// vector(const vector& v, const allocator_type& a);13 14#include <array>15#include <cassert>16#include <vector>17 18#include "min_allocator.h"19#include "test_allocator.h"20#include "test_macros.h"21 22template <class C>23TEST_CONSTEXPR_CXX20 void test(const C& x, const typename C::allocator_type& a) {24  typename C::size_type s = x.size();25  C c(x, a);26  LIBCPP_ASSERT(c.__invariants());27  assert(c.size() == s);28  assert(c == x);29  assert(c.get_allocator() == a);30}31 32TEST_CONSTEXPR_CXX20 bool tests() {33  std::array<int, 5> a1   = {1, 0, 1, 0, 1};34  std::array<int, 18> a2  = {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0};35  std::array<int, 33> a3  = {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0};36  std::array<int, 65> a4  = {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0};37  std::array<int, 299> a5 = {};38  for (unsigned i = 0; i < a5.size(); i += 2)39    a5[i] = 1;40 41  // Tests for allocator-extended copy constructor with word size up to 5 (i.e., bit size > 256 on a 64-bit system)42  { // Test with the default std::allocator43    test(std::vector<bool>(a1.begin(), a1.end()), std::allocator<bool>());44    test(std::vector<bool>(a2.begin(), a2.end()), std::allocator<bool>());45    test(std::vector<bool>(a3.begin(), a3.end()), std::allocator<bool>());46    test(std::vector<bool>(a4.begin(), a4.end()), std::allocator<bool>());47    test(std::vector<bool>(a5.begin(), a5.end()), std::allocator<bool>());48  }49  { // Test with test_allocator50    using A = test_allocator<bool>;51    using C = std::vector<bool, A>;52    test(C(a1.begin(), a1.end(), A(5)), A(3));53    test(C(a2.begin(), a2.end(), A(5)), A(3));54    test(C(a3.begin(), a3.end(), A(5)), A(3));55    test(C(a4.begin(), a4.end(), A(5)), A(3));56    test(C(a5.begin(), a5.end(), A(5)), A(3));57  }58  { // Test with other_allocator59    using A = other_allocator<bool>;60    using C = std::vector<bool, A>;61    test(C(a1.begin(), a1.end(), A(5)), A(3));62    test(C(a2.begin(), a2.end(), A(5)), A(3));63    test(C(a3.begin(), a3.end(), A(5)), A(3));64    test(C(a4.begin(), a4.end(), A(5)), A(3));65    test(C(a5.begin(), a5.end(), A(5)), A(3));66  }67  { // Test with min_allocator68    using A = min_allocator<bool>;69    using C = std::vector<bool, A>;70    test(C(a1.begin(), a1.end(), A()), A());71    test(C(a2.begin(), a2.end(), A()), A());72    test(C(a3.begin(), a3.end(), A()), A());73    test(C(a4.begin(), a4.end(), A()), A());74    test(C(a5.begin(), a5.end(), A()), A());75  }76 77  return true;78}79 80int main(int, char**) {81  tests();82#if TEST_STD_VER > 1783  static_assert(tests());84#endif85  return 0;86}87