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 | #ifndef TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H |
10 | #define TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H |
11 | |
12 | #include "test_macros.h" |
13 | |
14 | #include <type_traits> // for __libcpp_is_trivially_relocatable |
15 | |
16 | #ifndef TEST_HAS_NO_EXCEPTIONS |
17 | struct Throws { |
18 | Throws() : v_(0) {} |
19 | Throws(int v) : v_(v) {} |
20 | Throws(const Throws& rhs) : v_(rhs.v_) { |
21 | if (sThrows) |
22 | throw 1; |
23 | } |
24 | Throws(Throws&& rhs) : v_(rhs.v_) { |
25 | if (sThrows) |
26 | throw 1; |
27 | } |
28 | Throws& operator=(const Throws& rhs) { |
29 | v_ = rhs.v_; |
30 | return *this; |
31 | } |
32 | Throws& operator=(Throws&& rhs) { |
33 | v_ = rhs.v_; |
34 | return *this; |
35 | } |
36 | int v_; |
37 | static bool sThrows; |
38 | }; |
39 | |
40 | bool Throws::sThrows = false; |
41 | |
42 | struct ThrowingMoveOnly { |
43 | TEST_CONSTEXPR ThrowingMoveOnly() : value(0), do_throw(false) {} |
44 | TEST_CONSTEXPR explicit ThrowingMoveOnly(int v) : value(v), do_throw(false) {} |
45 | TEST_CONSTEXPR explicit ThrowingMoveOnly(int v, bool throw_) : value(v), do_throw(throw_) {} |
46 | |
47 | ThrowingMoveOnly(const ThrowingMoveOnly& rhs) = delete; |
48 | ThrowingMoveOnly& operator=(const ThrowingMoveOnly&) = delete; |
49 | |
50 | TEST_CONSTEXPR_CXX14 ThrowingMoveOnly(ThrowingMoveOnly&& rhs) : value(rhs.value), do_throw(rhs.do_throw) { |
51 | if (do_throw) |
52 | throw 1; |
53 | } |
54 | TEST_CONSTEXPR_CXX14 ThrowingMoveOnly& operator=(ThrowingMoveOnly&& rhs) { |
55 | value = rhs.value; |
56 | do_throw = rhs.do_throw; |
57 | if (do_throw) |
58 | throw 1; |
59 | return *this; |
60 | } |
61 | |
62 | TEST_CONSTEXPR_CXX14 friend bool operator==(ThrowingMoveOnly const& lhs, ThrowingMoveOnly const& rhs) { |
63 | return lhs.value == rhs.value; |
64 | } |
65 | |
66 | int value; |
67 | bool do_throw; |
68 | }; |
69 | #endif // TEST_HAS_NO_EXCEPTIONS |
70 | |
71 | struct Tracker { |
72 | int copy_assignments = 0; |
73 | int move_assignments = 0; |
74 | }; |
75 | |
76 | struct TrackedAssignment { |
77 | Tracker* tracker_; |
78 | TEST_CONSTEXPR_CXX14 explicit TrackedAssignment(Tracker* tracker) : tracker_(tracker) {} |
79 | |
80 | TrackedAssignment(TrackedAssignment const&) = default; |
81 | TrackedAssignment(TrackedAssignment&&) = default; |
82 | |
83 | TEST_CONSTEXPR_CXX14 TrackedAssignment& operator=(TrackedAssignment const&) { |
84 | tracker_->copy_assignments++; |
85 | return *this; |
86 | } |
87 | TEST_CONSTEXPR_CXX14 TrackedAssignment& operator=(TrackedAssignment&&) { |
88 | tracker_->move_assignments++; |
89 | return *this; |
90 | } |
91 | }; |
92 | |
93 | struct NonTriviallyRelocatable { |
94 | int value_; |
95 | TEST_CONSTEXPR NonTriviallyRelocatable() : value_(0) {} |
96 | TEST_CONSTEXPR explicit NonTriviallyRelocatable(int v) : value_(v) {} |
97 | TEST_CONSTEXPR NonTriviallyRelocatable(NonTriviallyRelocatable const& other) : value_(other.value_) {} |
98 | TEST_CONSTEXPR NonTriviallyRelocatable(NonTriviallyRelocatable&& other) : value_(other.value_) {} |
99 | TEST_CONSTEXPR_CXX14 NonTriviallyRelocatable& operator=(NonTriviallyRelocatable const& other) { |
100 | value_ = other.value_; |
101 | return *this; |
102 | } |
103 | TEST_CONSTEXPR_CXX14 NonTriviallyRelocatable& operator=(NonTriviallyRelocatable&& other) { |
104 | value_ = other.value_; |
105 | return *this; |
106 | } |
107 | |
108 | TEST_CONSTEXPR_CXX14 friend bool operator==(NonTriviallyRelocatable const& a, NonTriviallyRelocatable const& b) { |
109 | return a.value_ == b.value_; |
110 | } |
111 | }; |
112 | LIBCPP_STATIC_ASSERT(!std::__libcpp_is_trivially_relocatable<NonTriviallyRelocatable>::value, "" ); |
113 | |
114 | #endif // TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H |
115 | |