xref: /aosp_15_r20/external/libcxx/test/support/tracked_value.h (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
2*58b9f456SAndroid Build Coastguard Worker //
3*58b9f456SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*58b9f456SAndroid Build Coastguard Worker //
5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*58b9f456SAndroid Build Coastguard Worker //
8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*58b9f456SAndroid Build Coastguard Worker #ifndef SUPPORT_TRACKED_VALUE_H
10*58b9f456SAndroid Build Coastguard Worker #define SUPPORT_TRACKED_VALUE_H
11*58b9f456SAndroid Build Coastguard Worker 
12*58b9f456SAndroid Build Coastguard Worker #include <cassert>
13*58b9f456SAndroid Build Coastguard Worker 
14*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h"
15*58b9f456SAndroid Build Coastguard Worker 
16*58b9f456SAndroid Build Coastguard Worker struct TrackedValue {
17*58b9f456SAndroid Build Coastguard Worker     enum State { CONSTRUCTED, MOVED_FROM, DESTROYED };
18*58b9f456SAndroid Build Coastguard Worker     State state;
19*58b9f456SAndroid Build Coastguard Worker 
TrackedValueTrackedValue20*58b9f456SAndroid Build Coastguard Worker     TrackedValue() : state(State::CONSTRUCTED) {}
21*58b9f456SAndroid Build Coastguard Worker 
TrackedValueTrackedValue22*58b9f456SAndroid Build Coastguard Worker     TrackedValue(TrackedValue const& t) : state(State::CONSTRUCTED) {
23*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::MOVED_FROM && "copying a moved-from object");
24*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::DESTROYED  && "copying a destroyed object");
25*58b9f456SAndroid Build Coastguard Worker     }
26*58b9f456SAndroid Build Coastguard Worker 
27*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11
TrackedValueTrackedValue28*58b9f456SAndroid Build Coastguard Worker     TrackedValue(TrackedValue&& t) : state(State::CONSTRUCTED) {
29*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::MOVED_FROM && "double moving from an object");
30*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::DESTROYED  && "moving from a destroyed object");
31*58b9f456SAndroid Build Coastguard Worker         t.state = State::MOVED_FROM;
32*58b9f456SAndroid Build Coastguard Worker     }
33*58b9f456SAndroid Build Coastguard Worker #endif
34*58b9f456SAndroid Build Coastguard Worker 
35*58b9f456SAndroid Build Coastguard Worker     TrackedValue& operator=(TrackedValue const& t) {
36*58b9f456SAndroid Build Coastguard Worker         assert(state != State::DESTROYED && "copy assigning into destroyed object");
37*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::MOVED_FROM && "copying a moved-from object");
38*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::DESTROYED  && "copying a destroyed object");
39*58b9f456SAndroid Build Coastguard Worker         state = t.state;
40*58b9f456SAndroid Build Coastguard Worker         return *this;
41*58b9f456SAndroid Build Coastguard Worker     }
42*58b9f456SAndroid Build Coastguard Worker 
43*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11
44*58b9f456SAndroid Build Coastguard Worker     TrackedValue& operator=(TrackedValue&& t) {
45*58b9f456SAndroid Build Coastguard Worker         assert(state != State::DESTROYED && "move assigning into destroyed object");
46*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::MOVED_FROM && "double moving from an object");
47*58b9f456SAndroid Build Coastguard Worker         assert(t.state != State::DESTROYED  && "moving from a destroyed object");
48*58b9f456SAndroid Build Coastguard Worker         state = t.state;
49*58b9f456SAndroid Build Coastguard Worker         t.state = State::MOVED_FROM;
50*58b9f456SAndroid Build Coastguard Worker         return *this;
51*58b9f456SAndroid Build Coastguard Worker     }
52*58b9f456SAndroid Build Coastguard Worker #endif
53*58b9f456SAndroid Build Coastguard Worker 
~TrackedValueTrackedValue54*58b9f456SAndroid Build Coastguard Worker     ~TrackedValue() {
55*58b9f456SAndroid Build Coastguard Worker         assert(state != State::DESTROYED && "double-destroying an object");
56*58b9f456SAndroid Build Coastguard Worker         state = State::DESTROYED;
57*58b9f456SAndroid Build Coastguard Worker     }
58*58b9f456SAndroid Build Coastguard Worker };
59*58b9f456SAndroid Build Coastguard Worker 
60*58b9f456SAndroid Build Coastguard Worker #endif // SUPPORT_TRACKED_VALUE_H
61