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