diff options
| author | Eric Fiselier <eric@efcs.ca> | 2015-03-09 18:02:16 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2015-03-09 18:02:16 +0000 |
| commit | 66e41b66ad26fcdd214ad63074150dacb66bad74 (patch) | |
| tree | 7cb701abbf7d7ed054842367c5ab624330eca808 /libcxx/test/support | |
| parent | 8773b00036a35a02c36b2a1a6032793a97178e8a (diff) | |
| download | bcm5719-llvm-66e41b66ad26fcdd214ad63074150dacb66bad74.tar.gz bcm5719-llvm-66e41b66ad26fcdd214ad63074150dacb66bad74.zip | |
Add TrackedValue to test/support. Thanks to Louis Dionne
llvm-svn: 231674
Diffstat (limited to 'libcxx/test/support')
| -rw-r--r-- | libcxx/test/support/tracked_value.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libcxx/test/support/tracked_value.h b/libcxx/test/support/tracked_value.h new file mode 100644 index 00000000000..b0869b23bdc --- /dev/null +++ b/libcxx/test/support/tracked_value.h @@ -0,0 +1,50 @@ +#ifndef SUPPORT_TRACKED_VALUE_H +#define SUPPORT_TRACKED_VALUE_H + +#include <cassert> + +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"); + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + 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; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + 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 |

