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