//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H #define TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H #include "test_macros.h" #include // for __libcpp_is_trivially_relocatable #ifndef TEST_HAS_NO_EXCEPTIONS struct Throws { Throws() : v_(0) {} Throws(int v) : v_(v) {} Throws(const Throws& rhs) : v_(rhs.v_) { if (sThrows) throw 1; } Throws(Throws&& rhs) : v_(rhs.v_) { if (sThrows) throw 1; } Throws& operator=(const Throws& rhs) { v_ = rhs.v_; return *this; } Throws& operator=(Throws&& rhs) { v_ = rhs.v_; return *this; } int v_; static bool sThrows; }; bool Throws::sThrows = false; #endif struct Tracker { int copy_assignments = 0; int move_assignments = 0; }; struct TrackedAssignment { Tracker* tracker_; TEST_CONSTEXPR_CXX14 explicit TrackedAssignment(Tracker* tracker) : tracker_(tracker) {} TrackedAssignment(TrackedAssignment const&) = default; TrackedAssignment(TrackedAssignment&&) = default; TEST_CONSTEXPR_CXX14 TrackedAssignment& operator=(TrackedAssignment const&) { tracker_->copy_assignments++; return *this; } TEST_CONSTEXPR_CXX14 TrackedAssignment& operator=(TrackedAssignment&&) { tracker_->move_assignments++; return *this; } }; struct NonTriviallyRelocatable { int value_; TEST_CONSTEXPR NonTriviallyRelocatable() : value_(0) {} TEST_CONSTEXPR explicit NonTriviallyRelocatable(int v) : value_(v) {} TEST_CONSTEXPR NonTriviallyRelocatable(NonTriviallyRelocatable const& other) : value_(other.value_) {} TEST_CONSTEXPR NonTriviallyRelocatable(NonTriviallyRelocatable&& other) : value_(other.value_) {} TEST_CONSTEXPR_CXX14 NonTriviallyRelocatable& operator=(NonTriviallyRelocatable const& other) { value_ = other.value_; return *this; } TEST_CONSTEXPR_CXX14 NonTriviallyRelocatable& operator=(NonTriviallyRelocatable&& other) { value_ = other.value_; return *this; } TEST_CONSTEXPR_CXX14 friend bool operator==(NonTriviallyRelocatable const& a, NonTriviallyRelocatable const& b) { return a.value_ == b.value_; } }; LIBCPP_STATIC_ASSERT(!std::__libcpp_is_trivially_relocatable::value, ""); #endif // TEST_STD_CONTAINERS_SEQUENCES_VECTOR_VECTOR_MODIFIERS_COMMON_H