xref: /llvm-project/libcxx/test/std/containers/sequences/vector/vector.modifiers/common.h (revision 3a3517c5e9d45a1d1aae5320887478b228b0f8be)
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 #endif
42 
43 struct Tracker {
44   int copy_assignments = 0;
45   int move_assignments = 0;
46 };
47 
48 struct TrackedAssignment {
49   Tracker* tracker_;
50   TEST_CONSTEXPR_CXX14 explicit TrackedAssignment(Tracker* tracker) : tracker_(tracker) {}
51 
52   TrackedAssignment(TrackedAssignment const&) = default;
53   TrackedAssignment(TrackedAssignment&&)      = default;
54 
55   TEST_CONSTEXPR_CXX14 TrackedAssignment& operator=(TrackedAssignment const&) {
56     tracker_->copy_assignments++;
57     return *this;
58   }
59   TEST_CONSTEXPR_CXX14 TrackedAssignment& operator=(TrackedAssignment&&) {
60     tracker_->move_assignments++;
61     return *this;
62   }
63 };
64 
65 struct NonTriviallyRelocatable {
66   int value_;
67   TEST_CONSTEXPR NonTriviallyRelocatable() : value_(0) {}
68   TEST_CONSTEXPR explicit NonTriviallyRelocatable(int v) : value_(v) {}
69   TEST_CONSTEXPR NonTriviallyRelocatable(NonTriviallyRelocatable const& other) : value_(other.value_) {}
70   TEST_CONSTEXPR NonTriviallyRelocatable(NonTriviallyRelocatable&& other) : value_(other.value_) {}
71   TEST_CONSTEXPR_CXX14 NonTriviallyRelocatable& operator=(NonTriviallyRelocatable const& other) {
72     value_ = other.value_;
73     return *this;
74   }
75   TEST_CONSTEXPR_CXX14 NonTriviallyRelocatable& operator=(NonTriviallyRelocatable&& other) {
76     value_ = other.value_;
77     return *this;
78   }
79 
80   TEST_CONSTEXPR_CXX14 friend bool operator==(NonTriviallyRelocatable const& a, NonTriviallyRelocatable const& b) {
81     return a.value_ == b.value_;
82   }
83 };
84 LIBCPP_STATIC_ASSERT(!std::__libcpp_is_trivially_relocatable<NonTriviallyRelocatable>::value, "");
85 
86 #endif // TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H
87