1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H
10 #define TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H
12 #include "test_macros.h"
14 #include <type_traits> // for __libcpp_is_trivially_relocatable
16 #ifndef TEST_HAS_NO_EXCEPTIONS
19 Throws(int v
) : v_(v
) {}
20 Throws(const Throws
& rhs
) : v_(rhs
.v_
) {
24 Throws(Throws
&& rhs
) : v_(rhs
.v_
) {
28 Throws
& operator=(const Throws
& rhs
) {
32 Throws
& operator=(Throws
&& rhs
) {
40 bool Throws::sThrows
= false;
44 int copy_assignments
= 0;
45 int move_assignments
= 0;
48 struct TrackedAssignment
{
50 TEST_CONSTEXPR_CXX14
explicit TrackedAssignment(Tracker
* tracker
) : tracker_(tracker
) {}
52 TrackedAssignment(TrackedAssignment
const&) = default;
53 TrackedAssignment(TrackedAssignment
&&) = default;
55 TEST_CONSTEXPR_CXX14 TrackedAssignment
& operator=(TrackedAssignment
const&) {
56 tracker_
->copy_assignments
++;
59 TEST_CONSTEXPR_CXX14 TrackedAssignment
& operator=(TrackedAssignment
&&) {
60 tracker_
->move_assignments
++;
65 struct NonTriviallyRelocatable
{
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_
;
75 TEST_CONSTEXPR_CXX14 NonTriviallyRelocatable
& operator=(NonTriviallyRelocatable
&& other
) {
76 value_
= other
.value_
;
80 TEST_CONSTEXPR_CXX14
friend bool operator==(NonTriviallyRelocatable
const& a
, NonTriviallyRelocatable
const& b
) {
81 return a
.value_
== b
.value_
;
84 LIBCPP_STATIC_ASSERT(!std::__libcpp_is_trivially_relocatable
<NonTriviallyRelocatable
>::value
, "");
86 #endif // TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H