brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 32efddb Raw
147 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// <list>10 11// template <class T, class Alloc>12//   void swap(list<T,Alloc>& x, list<T,Alloc>& y); // constexpr since C++2613 14#include <list>15#include <cassert>16#include "test_macros.h"17#include "test_allocator.h"18#include "min_allocator.h"19 20TEST_CONSTEXPR_CXX26 bool test() {21  {22    int a1[] = {1, 3, 7, 9, 10};23    int a2[] = {0, 2, 4, 5, 6, 8, 11};24    std::list<int> c1(a1, a1 + 5);25    std::list<int> c2(a2, a2 + 7);26    std::list<int>::iterator it1       = c1.begin();27    std::list<int>::const_iterator it2 = c2.begin();28    swap(c1, c2);29    assert(c1 == std::list<int>(a2, a2 + 7));30    assert(c2 == std::list<int>(a1, a1 + 5));31    assert(it1 == c2.begin()); // Iterators remain valid32    assert(it2 == c1.begin()); // Iterators remain valid33  }34  {35    int a2[] = {0, 2, 4, 5, 6, 8, 11};36    std::list<int> c1;37    std::list<int> c2(a2, a2 + 7);38    swap(c1, c2);39    assert(c1 == std::list<int>(a2, a2 + 7));40    assert(c2.empty());41    assert(std::distance(c2.begin(), c2.end()) == 0);42  }43  {44    int a1[] = {1, 3, 7, 9, 10};45    std::list<int> c1(a1, a1 + 5);46    std::list<int> c2;47    swap(c1, c2);48    assert(c1.empty());49    assert(std::distance(c1.begin(), c1.end()) == 0);50    assert(c2 == std::list<int>(a1, a1 + 5));51  }52  {53    std::list<int> c1;54    std::list<int> c2;55    swap(c1, c2);56    assert(c1.empty());57    assert(std::distance(c1.begin(), c1.end()) == 0);58    assert(c2.empty());59    assert(std::distance(c2.begin(), c2.end()) == 0);60  }61  {62    int a1[] = {1, 3, 7, 9, 10};63    int a2[] = {0, 2, 4, 5, 6, 8, 11};64    typedef test_allocator<int> A;65    std::list<int, A> c1(a1, a1 + 5, A(1));66    std::list<int, A> c2(a2, a2 + 7, A(1));67    swap(c1, c2);68    assert((c1 == std::list<int, A>(a2, a2 + 7)));69    assert(c1.get_allocator() == A(1));70    assert((c2 == std::list<int, A>(a1, a1 + 5)));71    assert(c2.get_allocator() == A(1));72  }73  {74    int a1[] = {1, 3, 7, 9, 10};75    int a2[] = {0, 2, 4, 5, 6, 8, 11};76    typedef other_allocator<int> A;77    std::list<int, A> c1(a1, a1 + 5, A(1));78    std::list<int, A> c2(a2, a2 + 7, A(2));79    swap(c1, c2);80    assert((c1 == std::list<int, A>(a2, a2 + 7)));81    assert(c1.get_allocator() == A(2));82    assert((c2 == std::list<int, A>(a1, a1 + 5)));83    assert(c2.get_allocator() == A(1));84  }85#if TEST_STD_VER >= 1186  {87    int a1[] = {1, 3, 7, 9, 10};88    int a2[] = {0, 2, 4, 5, 6, 8, 11};89    std::list<int, min_allocator<int>> c1(a1, a1 + 5);90    std::list<int, min_allocator<int>> c2(a2, a2 + 7);91    swap(c1, c2);92    assert((c1 == std::list<int, min_allocator<int>>(a2, a2 + 7)));93    assert((c2 == std::list<int, min_allocator<int>>(a1, a1 + 5)));94  }95  {96    int a2[] = {0, 2, 4, 5, 6, 8, 11};97    std::list<int, min_allocator<int>> c1;98    std::list<int, min_allocator<int>> c2(a2, a2 + 7);99    swap(c1, c2);100    assert((c1 == std::list<int, min_allocator<int>>(a2, a2 + 7)));101    assert(c2.empty());102    assert(std::distance(c2.begin(), c2.end()) == 0);103  }104  {105    int a1[] = {1, 3, 7, 9, 10};106    std::list<int, min_allocator<int>> c1(a1, a1 + 5);107    std::list<int, min_allocator<int>> c2;108    swap(c1, c2);109    assert(c1.empty());110    assert(std::distance(c1.begin(), c1.end()) == 0);111    assert((c2 == std::list<int, min_allocator<int>>(a1, a1 + 5)));112  }113  {114    std::list<int, min_allocator<int>> c1;115    std::list<int, min_allocator<int>> c2;116    swap(c1, c2);117    assert(c1.empty());118    assert(std::distance(c1.begin(), c1.end()) == 0);119    assert(c2.empty());120    assert(std::distance(c2.begin(), c2.end()) == 0);121  }122  {123    int a1[] = {1, 3, 7, 9, 10};124    int a2[] = {0, 2, 4, 5, 6, 8, 11};125    typedef min_allocator<int> A;126    std::list<int, A> c1(a1, a1 + 5, A());127    std::list<int, A> c2(a2, a2 + 7, A());128    swap(c1, c2);129    assert((c1 == std::list<int, A>(a2, a2 + 7)));130    assert(c1.get_allocator() == A());131    assert((c2 == std::list<int, A>(a1, a1 + 5)));132    assert(c2.get_allocator() == A());133  }134#endif135 136  return true;137}138 139int main(int, char**) {140  assert(test());141#if TEST_STD_VER >= 26142  static_assert(test());143#endif144 145  return 0;146}147