brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · 0da2f82 Raw
197 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 11// template <class T, class Alloc>12//   void swap(vector<T,Alloc>& x, vector<T,Alloc>& y);13 14#include <vector>15#include <iterator>16#include <cassert>17#include "test_macros.h"18#include "test_allocator.h"19#include "min_allocator.h"20#include "asan_testing.h"21 22template <typename A>23TEST_CONSTEXPR_CXX20 void test_with_allocator() {24  {25    int a1[] = {1, 3, 7, 9, 10};26    int a2[] = {0, 2, 4, 5, 6, 8, 11};27    std::vector<int, A> c1(a1, a1 + sizeof(a1) / sizeof(a1[0]));28    std::vector<int, A> c2(a2, a2 + sizeof(a2) / sizeof(a2[0]));29    assert(is_contiguous_container_asan_correct(c1));30    assert(is_contiguous_container_asan_correct(c2));31    swap(c1, c2);32    assert((c1 == std::vector<int, A>(a2, a2 + sizeof(a2) / sizeof(a2[0]))));33    assert((c2 == std::vector<int, A>(a1, a1 + sizeof(a1) / sizeof(a1[0]))));34    assert(is_contiguous_container_asan_correct(c1));35    assert(is_contiguous_container_asan_correct(c2));36  }37  {38    int a1[] = {1, 3, 7, 9, 10};39    int a2[] = {0, 2, 4, 5, 6, 8, 11};40    std::vector<int, A> c1(a1, a1);41    std::vector<int, A> c2(a2, a2 + sizeof(a2) / sizeof(a2[0]));42    assert(is_contiguous_container_asan_correct(c1));43    assert(is_contiguous_container_asan_correct(c2));44    swap(c1, c2);45    assert((c1 == std::vector<int, A>(a2, a2 + sizeof(a2) / sizeof(a2[0]))));46    assert(c2.empty());47    assert(std::distance(c2.begin(), c2.end()) == 0);48    assert(is_contiguous_container_asan_correct(c1));49    assert(is_contiguous_container_asan_correct(c2));50  }51  {52    int a1[] = {1, 3, 7, 9, 10};53    int a2[] = {0, 2, 4, 5, 6, 8, 11};54    std::vector<int, A> c1(a1, a1 + sizeof(a1) / sizeof(a1[0]));55    std::vector<int, A> c2(a2, a2);56    assert(is_contiguous_container_asan_correct(c1));57    assert(is_contiguous_container_asan_correct(c2));58    swap(c1, c2);59    assert(c1.empty());60    assert(std::distance(c1.begin(), c1.end()) == 0);61    assert((c2 == std::vector<int, A>(a1, a1 + sizeof(a1) / sizeof(a1[0]))));62    assert(is_contiguous_container_asan_correct(c1));63    assert(is_contiguous_container_asan_correct(c2));64  }65  {66    int a1[] = {1, 3, 7, 9, 10};67    int a2[] = {0, 2, 4, 5, 6, 8, 11};68    std::vector<int, A> c1(a1, a1);69    std::vector<int, A> c2(a2, a2);70    assert(is_contiguous_container_asan_correct(c1));71    assert(is_contiguous_container_asan_correct(c2));72    swap(c1, c2);73    assert(c1.empty());74    assert(std::distance(c1.begin(), c1.end()) == 0);75    assert(c2.empty());76    assert(std::distance(c2.begin(), c2.end()) == 0);77    assert(is_contiguous_container_asan_correct(c1));78    assert(is_contiguous_container_asan_correct(c2));79  }80  {81    int a1[] = {1, 3, 7, 9, 10};82    int a2[] = {0, 2, 4, 5, 6, 8, 11};83    std::vector<int, A> c1(a1, a1 + sizeof(a1) / sizeof(a1[0]), A());84    std::vector<int, A> c2(a2, a2 + sizeof(a2) / sizeof(a2[0]), A());85    assert(is_contiguous_container_asan_correct(c1));86    assert(is_contiguous_container_asan_correct(c2));87    swap(c1, c2);88    assert((c1 == std::vector<int, A>(a2, a2 + sizeof(a2) / sizeof(a2[0]))));89    assert(c1.get_allocator() == A());90    assert((c2 == std::vector<int, A>(a1, a1 + sizeof(a1) / sizeof(a1[0]))));91    assert(c2.get_allocator() == A());92    assert(is_contiguous_container_asan_correct(c1));93    assert(is_contiguous_container_asan_correct(c2));94  }95}96 97TEST_CONSTEXPR_CXX20 bool tests() {98  {99    int a1[] = {1, 3, 7, 9, 10};100    int a2[] = {0, 2, 4, 5, 6, 8, 11};101    std::vector<int> c1(a1, a1 + sizeof(a1) / sizeof(a1[0]));102    std::vector<int> c2(a2, a2 + sizeof(a2) / sizeof(a2[0]));103    assert(is_contiguous_container_asan_correct(c1));104    assert(is_contiguous_container_asan_correct(c2));105    swap(c1, c2);106    assert(c1 == std::vector<int>(a2, a2 + sizeof(a2) / sizeof(a2[0])));107    assert(c2 == std::vector<int>(a1, a1 + sizeof(a1) / sizeof(a1[0])));108    assert(is_contiguous_container_asan_correct(c1));109    assert(is_contiguous_container_asan_correct(c2));110  }111  {112    int a1[] = {1, 3, 7, 9, 10};113    int a2[] = {0, 2, 4, 5, 6, 8, 11};114    std::vector<int> c1(a1, a1);115    std::vector<int> c2(a2, a2 + sizeof(a2) / sizeof(a2[0]));116    assert(is_contiguous_container_asan_correct(c1));117    assert(is_contiguous_container_asan_correct(c2));118    swap(c1, c2);119    assert(c1 == std::vector<int>(a2, a2 + sizeof(a2) / sizeof(a2[0])));120    assert(c2.empty());121    assert(std::distance(c2.begin(), c2.end()) == 0);122    assert(is_contiguous_container_asan_correct(c1));123    assert(is_contiguous_container_asan_correct(c2));124  }125  {126    int a1[] = {1, 3, 7, 9, 10};127    int a2[] = {0, 2, 4, 5, 6, 8, 11};128    std::vector<int> c1(a1, a1 + sizeof(a1) / sizeof(a1[0]));129    std::vector<int> c2(a2, a2);130    assert(is_contiguous_container_asan_correct(c1));131    assert(is_contiguous_container_asan_correct(c2));132    swap(c1, c2);133    assert(c1.empty());134    assert(std::distance(c1.begin(), c1.end()) == 0);135    assert(c2 == std::vector<int>(a1, a1 + sizeof(a1) / sizeof(a1[0])));136    assert(is_contiguous_container_asan_correct(c1));137    assert(is_contiguous_container_asan_correct(c2));138  }139  {140    int a1[] = {1, 3, 7, 9, 10};141    int a2[] = {0, 2, 4, 5, 6, 8, 11};142    std::vector<int> c1(a1, a1);143    std::vector<int> c2(a2, a2);144    assert(is_contiguous_container_asan_correct(c1));145    assert(is_contiguous_container_asan_correct(c2));146    swap(c1, c2);147    assert(c1.empty());148    assert(std::distance(c1.begin(), c1.end()) == 0);149    assert(c2.empty());150    assert(std::distance(c2.begin(), c2.end()) == 0);151    assert(is_contiguous_container_asan_correct(c1));152    assert(is_contiguous_container_asan_correct(c2));153  }154  {155    int a1[] = {1, 3, 7, 9, 10};156    int a2[] = {0, 2, 4, 5, 6, 8, 11};157    typedef test_allocator<int> A;158    std::vector<int, A> c1(a1, a1 + sizeof(a1) / sizeof(a1[0]), A(1, 1));159    std::vector<int, A> c2(a2, a2 + sizeof(a2) / sizeof(a2[0]), A(1, 2));160    swap(c1, c2);161    assert((c1 == std::vector<int, A>(a2, a2 + sizeof(a2) / sizeof(a2[0]))));162    assert(c1.get_allocator().get_id() == 1);163    assert((c2 == std::vector<int, A>(a1, a1 + sizeof(a1) / sizeof(a1[0]))));164    assert(c2.get_allocator().get_id() == 2);165  }166  {167    int a1[] = {1, 3, 7, 9, 10};168    int a2[] = {0, 2, 4, 5, 6, 8, 11};169    typedef other_allocator<int> A;170    std::vector<int, A> c1(a1, a1 + sizeof(a1) / sizeof(a1[0]), A(1));171    std::vector<int, A> c2(a2, a2 + sizeof(a2) / sizeof(a2[0]), A(2));172    assert(is_contiguous_container_asan_correct(c1));173    assert(is_contiguous_container_asan_correct(c2));174    swap(c1, c2);175    assert((c1 == std::vector<int, A>(a2, a2 + sizeof(a2) / sizeof(a2[0]))));176    assert(c1.get_allocator() == A(2));177    assert((c2 == std::vector<int, A>(a1, a1 + sizeof(a1) / sizeof(a1[0]))));178    assert(c2.get_allocator() == A(1));179    assert(is_contiguous_container_asan_correct(c1));180    assert(is_contiguous_container_asan_correct(c2));181  }182#if TEST_STD_VER >= 11183  test_with_allocator<min_allocator<int>>();184  test_with_allocator<safe_allocator<int>>();185#endif186 187  return true;188}189 190int main(int, char**) {191  tests();192#if TEST_STD_VER > 17193  static_assert(tests());194#endif195  return 0;196}197