summaryrefslogtreecommitdiffstats
path: root/src/test/ui/traits/conditional-model-fn.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/traits/conditional-model-fn.rs')
-rw-r--r--src/test/ui/traits/conditional-model-fn.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/test/ui/traits/conditional-model-fn.rs b/src/test/ui/traits/conditional-model-fn.rs
new file mode 100644
index 000000000..ba8867003
--- /dev/null
+++ b/src/test/ui/traits/conditional-model-fn.rs
@@ -0,0 +1,53 @@
+// run-pass
+#![allow(unused_imports)]
+// A model for how the `Fn` traits could work. You can implement at
+// most one of `Go`, `GoMut`, or `GoOnce`, and then the others follow
+// automatically.
+
+// aux-build:go_trait.rs
+
+extern crate go_trait;
+
+use go_trait::{Go, GoMut, GoOnce, go, go_mut, go_once};
+
+use std::rc::Rc;
+use std::cell::Cell;
+
+struct SomeGoableThing {
+ counter: Rc<Cell<isize>>
+}
+
+impl Go for SomeGoableThing {
+ fn go(&self, arg: isize) {
+ self.counter.set(self.counter.get() + arg);
+ }
+}
+
+struct SomeGoOnceableThing {
+ counter: Rc<Cell<isize>>
+}
+
+impl GoOnce for SomeGoOnceableThing {
+ fn go_once(self, arg: isize) {
+ self.counter.set(self.counter.get() + arg);
+ }
+}
+
+fn main() {
+ let counter = Rc::new(Cell::new(0));
+ let mut x = SomeGoableThing { counter: counter.clone() };
+
+ go(&x, 10);
+ assert_eq!(counter.get(), 10);
+
+ go_mut(&mut x, 100);
+ assert_eq!(counter.get(), 110);
+
+ go_once(x, 1_000);
+ assert_eq!(counter.get(), 1_110);
+
+ let x = SomeGoOnceableThing { counter: counter.clone() };
+
+ go_once(x, 10_000);
+ assert_eq!(counter.get(), 11_110);
+}