summaryrefslogtreecommitdiff
path: root/exercises/19_smart_pointers/rc1.rs
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/19_smart_pointers/rc1.rs')
-rw-r--r--exercises/19_smart_pointers/rc1.rs105
1 files changed, 105 insertions, 0 deletions
diff --git a/exercises/19_smart_pointers/rc1.rs b/exercises/19_smart_pointers/rc1.rs
new file mode 100644
index 0000000..1b90346
--- /dev/null
+++ b/exercises/19_smart_pointers/rc1.rs
@@ -0,0 +1,105 @@
+// rc1.rs
+//
+// In this exercise, we want to express the concept of multiple owners via the
+// Rc<T> type. This is a model of our solar system - there is a Sun type and
+// multiple Planets. The Planets take ownership of the sun, indicating that they
+// revolve around the sun.
+//
+// Make this code compile by using the proper Rc primitives to express that the
+// sun has multiple owners.
+//
+// Execute `rustlings hint rc1` or use the `hint` watch subcommand for a hint.
+
+// I AM NOT DONE
+
+use std::rc::Rc;
+
+#[derive(Debug)]
+struct Sun {}
+
+#[derive(Debug)]
+enum Planet {
+ Mercury(Rc<Sun>),
+ Venus(Rc<Sun>),
+ Earth(Rc<Sun>),
+ Mars(Rc<Sun>),
+ Jupiter(Rc<Sun>),
+ Saturn(Rc<Sun>),
+ Uranus(Rc<Sun>),
+ Neptune(Rc<Sun>),
+}
+
+impl Planet {
+ fn details(&self) {
+ println!("Hi from {:?}!", self)
+ }
+}
+
+#[test]
+fn main() {
+ let sun = Rc::new(Sun {});
+ println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference
+
+ let mercury = Planet::Mercury(Rc::clone(&sun));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 2 references
+ mercury.details();
+
+ let venus = Planet::Venus(Rc::clone(&sun));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 3 references
+ venus.details();
+
+ let earth = Planet::Earth(Rc::clone(&sun));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 4 references
+ earth.details();
+
+ let mars = Planet::Mars(Rc::clone(&sun));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 5 references
+ mars.details();
+
+ let jupiter = Planet::Jupiter(Rc::clone(&sun));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 6 references
+ jupiter.details();
+
+ // TODO
+ let saturn = Planet::Saturn(Rc::new(Sun {}));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 7 references
+ saturn.details();
+
+ // TODO
+ let uranus = Planet::Uranus(Rc::new(Sun {}));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 8 references
+ uranus.details();
+
+ // TODO
+ let neptune = Planet::Neptune(Rc::new(Sun {}));
+ println!("reference count = {}", Rc::strong_count(&sun)); // 9 references
+ neptune.details();
+
+ assert_eq!(Rc::strong_count(&sun), 9);
+
+ drop(neptune);
+ println!("reference count = {}", Rc::strong_count(&sun)); // 8 references
+
+ drop(uranus);
+ println!("reference count = {}", Rc::strong_count(&sun)); // 7 references
+
+ drop(saturn);
+ println!("reference count = {}", Rc::strong_count(&sun)); // 6 references
+
+ drop(jupiter);
+ println!("reference count = {}", Rc::strong_count(&sun)); // 5 references
+
+ drop(mars);
+ println!("reference count = {}", Rc::strong_count(&sun)); // 4 references
+
+ // TODO
+ println!("reference count = {}", Rc::strong_count(&sun)); // 3 references
+
+ // TODO
+ println!("reference count = {}", Rc::strong_count(&sun)); // 2 references
+
+ // TODO
+ println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference
+
+ assert_eq!(Rc::strong_count(&sun), 1);
+}