summaryrefslogtreecommitdiffstats
path: root/libcxx/test/support
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2015-03-09 18:02:16 +0000
committerEric Fiselier <eric@efcs.ca>2015-03-09 18:02:16 +0000
commit66e41b66ad26fcdd214ad63074150dacb66bad74 (patch)
tree7cb701abbf7d7ed054842367c5ab624330eca808 /libcxx/test/support
parent8773b00036a35a02c36b2a1a6032793a97178e8a (diff)
downloadbcm5719-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.h50
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
OpenPOWER on IntegriCloud