3 use std::cell::RefCell;
4 use std::convert::TryInto;
7 struct DropOrderCollector(RefCell<Vec<u32>>);
9 struct LoudDrop<'a>(&'a DropOrderCollector, u32);
11 impl Drop for LoudDrop<'_> {
13 println!("{}", self.1);
14 self.0.0.borrow_mut().push(self.1);
18 impl DropOrderCollector {
19 fn option_loud_drop(&self, n: u32) -> Option<LoudDrop> {
20 Some(LoudDrop(self, n))
23 fn loud_drop(&self, n: u32) -> LoudDrop {
27 fn print(&self, n: u32) {
29 self.0.borrow_mut().push(n)
33 if self.option_loud_drop(1).is_some() {
37 if self.option_loud_drop(3).is_none() {
39 } else if self.option_loud_drop(4).is_some() {
44 if self.option_loud_drop(7).is_some() && self.option_loud_drop(6).is_some() {
56 if let None = self.option_loud_drop(2) {
62 if let Some(_) = self.option_loud_drop(4) {
66 if let Some(_d) = self.option_loud_drop(6) {
72 match self.option_loud_drop(2) {
73 _any => self.print(1),
76 match self.option_loud_drop(4) {
80 match self.option_loud_drop(6) {
81 Some(_) => self.print(5),
86 let _ = self.loud_drop(7);
87 let _d = self.loud_drop(9);
95 match self.option_loud_drop(14) {
98 self.option_loud_drop(13)
107 break match self.option_loud_drop(16) {
110 self.option_loud_drop(18)
119 fn assert_sorted(self) {
125 .all(|(idx, item)| idx + 1 == item.try_into().unwrap())
131 println!("-- if --");
132 let collector = DropOrderCollector::default();
134 collector.assert_sorted();
136 println!("-- if let --");
137 let collector = DropOrderCollector::default();
139 collector.assert_sorted();
141 println!("-- match --");
142 let collector = DropOrderCollector::default();
144 collector.assert_sorted();