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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03
10
11// <deque>
12
13// deque& operator=(deque&& c);
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(5));
30 for (int* p = ab; p < an; ++p)
31 c1.push_back(MoveOnly(*p));
32 std::deque<MoveOnly, A> c2(A(5));
33 for (int* p = ab; p < an; ++p)
34 c2.push_back(MoveOnly(*p));
35 std::deque<MoveOnly, A> c3(A(5));
36 c3 = std::move(c1);
37 assert(c2 == c3);
38 assert(c1.size() == 0);
39 assert(c3.get_allocator() == A(5));
40 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));
41 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));
42 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));
43 }
44 {
45 int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};
46 int* an = ab + sizeof(ab) / sizeof(ab[0]);
47 typedef test_allocator<MoveOnly> A;
48 std::deque<MoveOnly, A> c1(A(5));
49 for (int* p = ab; p < an; ++p)
50 c1.push_back(MoveOnly(*p));
51 std::deque<MoveOnly, A> c2(A(5));
52 for (int* p = ab; p < an; ++p)
53 c2.push_back(MoveOnly(*p));
54 std::deque<MoveOnly, A> c3(A(6));
55 c3 = std::move(c1);
56 assert(c2 == c3);
57 assert(c1.size() != 0);
58 assert(c3.get_allocator() == A(6));
59 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));
60 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));
61 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));
62 }
63 {
64 int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};
65 int* an = ab + sizeof(ab) / sizeof(ab[0]);
66 typedef other_allocator<MoveOnly> A;
67 std::deque<MoveOnly, A> c1(A(5));
68 for (int* p = ab; p < an; ++p)
69 c1.push_back(MoveOnly(*p));
70 std::deque<MoveOnly, A> c2(A(5));
71 for (int* p = ab; p < an; ++p)
72 c2.push_back(MoveOnly(*p));
73 std::deque<MoveOnly, A> c3(A(6));
74 c3 = std::move(c1);
75 assert(c2 == c3);
76 assert(c1.size() == 0);
77 assert(c3.get_allocator() == A(5));
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 int ab[] = {3, 4, 2, 8, 0, 1, 44, 34, 45, 96, 80, 1, 13, 31, 45};
84 int* an = ab + sizeof(ab) / sizeof(ab[0]);
85 typedef min_allocator<MoveOnly> A;
86 std::deque<MoveOnly, A> c1(A{});
87 for (int* p = ab; p < an; ++p)
88 c1.push_back(MoveOnly(*p));
89 std::deque<MoveOnly, A> c2(A{});
90 for (int* p = ab; p < an; ++p)
91 c2.push_back(MoveOnly(*p));
92 std::deque<MoveOnly, A> c3(A{});
93 c3 = std::move(c1);
94 assert(c2 == c3);
95 assert(c1.size() == 0);
96 assert(c3.get_allocator() == A());
97 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));
98 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));
99 LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c3));
100 }
101
102 return 0;
103}
104

source code of libcxx/test/std/containers/sequences/deque/deque.cons/move_assign.pass.cpp