1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- //===----------------------------------------------------------------------===//
- //
- // 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 SUPPORT_TRACKED_VALUE_H
- #define SUPPORT_TRACKED_VALUE_H
- #include <cassert>
- #include "test_macros.h"
- struct TrackedValue {
- enum State { CONSTRUCTED, MOVED_FROM, DESTROYED };
- State state;
- TrackedValue() : state(State::CONSTRUCTED) {}
- TrackedValue(TrackedValue const& t) : state(State::CONSTRUCTED) {
- assert(t.state != State::MOVED_FROM && "copying a moved-from object");
- assert(t.state != State::DESTROYED && "copying a destroyed object");
- }
- #if TEST_STD_VER >= 11
- TrackedValue(TrackedValue&& t) : state(State::CONSTRUCTED) {
- assert(t.state != State::MOVED_FROM && "double moving from an object");
- assert(t.state != State::DESTROYED && "moving from a destroyed object");
- t.state = State::MOVED_FROM;
- }
- #endif
- TrackedValue& operator=(TrackedValue const& t) {
- assert(state != State::DESTROYED && "copy assigning into destroyed object");
- assert(t.state != State::MOVED_FROM && "copying a moved-from object");
- assert(t.state != State::DESTROYED && "copying a destroyed object");
- state = t.state;
- return *this;
- }
- #if TEST_STD_VER >= 11
- TrackedValue& operator=(TrackedValue&& t) {
- assert(state != State::DESTROYED && "move assigning into destroyed object");
- assert(t.state != State::MOVED_FROM && "double moving from an object");
- assert(t.state != State::DESTROYED && "moving from a destroyed object");
- state = t.state;
- t.state = State::MOVED_FROM;
- return *this;
- }
- #endif
- ~TrackedValue() {
- assert(state != State::DESTROYED && "double-destroying an object");
- state = State::DESTROYED;
- }
- };
- #endif // SUPPORT_TRACKED_VALUE_H
|