brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 66ff168 Raw
85 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// UNSUPPORTED: c++0310 11// <deque>12 13// deque(deque&&);14 15#include "asan_testing.h"16#include <deque>17#include <cassert>18 19#include "test_macros.h"20#include "MoveOnly.h"21#include "test_allocator.h"22#include "min_allocator.h"23 24int main(int, char**) {25  {26    int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};27    int* an  = ab + sizeof(ab) / sizeof(ab[0]);28    typedef test_allocator<MoveOnly> A;29    std::deque<MoveOnly, A> c1(A(1));30    for (int* p = ab; p < an; ++p)31      c1.push_back(MoveOnly(*p));32    std::deque<MoveOnly, A> c2(A(2));33    for (int* p = ab; p < an; ++p)34      c2.push_back(MoveOnly(*p));35    A old_a                    = c1.get_allocator();36    std::deque<MoveOnly, A> c3 = std::move(c1);37    assert(c2 == c3);38    assert(c1.size() == 0);39    assert(c3.get_allocator() == old_a);40    assert(c1.get_allocator() == A(1));41    assert(c1.get_allocator().get_id() == test_alloc_base::moved_value);42    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));43    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));44    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));45  }46  {47    int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};48    int* an  = ab + sizeof(ab) / sizeof(ab[0]);49    typedef other_allocator<MoveOnly> A;50    std::deque<MoveOnly, A> c1(A(1));51    for (int* p = ab; p < an; ++p)52      c1.push_back(MoveOnly(*p));53    std::deque<MoveOnly, A> c2(A(2));54    for (int* p = ab; p < an; ++p)55      c2.push_back(MoveOnly(*p));56    std::deque<MoveOnly, A> c3 = std::move(c1);57    assert(c2 == c3);58    assert(c1.size() == 0);59    assert(c3.get_allocator() == c1.get_allocator());60    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));61    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));62    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));63  }64  {65    int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};66    int* an  = ab + sizeof(ab) / sizeof(ab[0]);67    typedef min_allocator<MoveOnly> A;68    std::deque<MoveOnly, A> c1(A{});69    for (int* p = ab; p < an; ++p)70      c1.push_back(MoveOnly(*p));71    std::deque<MoveOnly, A> c2(A{});72    for (int* p = ab; p < an; ++p)73      c2.push_back(MoveOnly(*p));74    std::deque<MoveOnly, A> c3 = std::move(c1);75    assert(c2 == c3);76    assert(c1.size() == 0);77    assert(c3.get_allocator() == c1.get_allocator());78    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));79    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));80    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));81  }82 83  return 0;84}85