@@ -40,79 +40,81 @@ struct Node<K, V> {
40
40
/// # use kernel::prelude::*;
41
41
/// use kernel::rbtree::RBTree;
42
42
///
43
- /// fn rbtest() -> Result {
44
- /// // Create a new tree.
45
- /// let mut tree = RBTree::new();
46
- ///
47
- /// // Insert three elements.
48
- /// tree.try_insert(20, 200)?;
49
- /// tree.try_insert(10, 100)?;
50
- /// tree.try_insert(30, 300)?;
51
- ///
52
- /// // Check the nodes we just inserted.
53
- /// {
54
- /// let mut iter = tree.iter();
55
- /// assert_eq!(iter.next().unwrap(), (&10, &100));
56
- /// assert_eq!(iter.next().unwrap(), (&20, &200));
57
- /// assert_eq!(iter.next().unwrap(), (&30, &300));
58
- /// assert!(iter.next().is_none());
59
- /// }
60
- ///
61
- /// // Print all elements.
62
- /// for (key, value) in &tree {
63
- /// pr_info!("{} = {}\n", key, value);
64
- /// }
65
- ///
66
- /// // Replace one of the elements.
67
- /// tree.try_insert(10, 1000)?;
68
- ///
69
- /// // Check that the tree reflects the replacement.
70
- /// {
71
- /// let mut iter = tree.iter();
72
- /// assert_eq!(iter.next().unwrap(), (&10, &1000));
73
- /// assert_eq!(iter.next().unwrap(), (&20, &200));
74
- /// assert_eq!(iter.next().unwrap(), (&30, &300));
75
- /// assert!(iter.next().is_none());
76
- /// }
77
- ///
78
- /// // Change the value of one of the elements.
79
- /// *tree.get_mut(&30).unwrap() = 3000;
80
- ///
81
- /// // Check that the tree reflects the update.
82
- /// {
83
- /// let mut iter = tree.iter();
84
- /// assert_eq!(iter.next().unwrap(), (&10, &1000));
85
- /// assert_eq!(iter.next().unwrap(), (&20, &200));
86
- /// assert_eq!(iter.next().unwrap(), (&30, &3000));
87
- /// assert!(iter.next().is_none());
88
- /// }
89
- ///
90
- /// // Remove an element.
91
- /// tree.remove(&10);
92
- ///
93
- /// // Check that the tree reflects the removal.
94
- /// {
95
- /// let mut iter = tree.iter();
96
- /// assert_eq!(iter.next().unwrap(), (&20, &200));
97
- /// assert_eq!(iter.next().unwrap(), (&30, &3000));
98
- /// assert!(iter.next().is_none());
99
- /// }
100
- ///
101
- /// // Update all values.
102
- /// for value in tree.values_mut() {
103
- /// *value *= 10;
104
- /// }
105
- ///
106
- /// // Check that the tree reflects the changes to values.
107
- /// {
108
- /// let mut iter = tree.iter();
109
- /// assert_eq!(iter.next().unwrap(), (&20, &2000));
110
- /// assert_eq!(iter.next().unwrap(), (&30, &30000));
111
- /// assert!(iter.next().is_none());
112
- /// }
43
+ /// # fn test() -> Result {
44
+ /// // Create a new tree.
45
+ /// let mut tree = RBTree::new();
46
+ ///
47
+ /// // Insert three elements.
48
+ /// tree.try_insert(20, 200)?;
49
+ /// tree.try_insert(10, 100)?;
50
+ /// tree.try_insert(30, 300)?;
51
+ ///
52
+ /// // Check the nodes we just inserted.
53
+ /// {
54
+ /// let mut iter = tree.iter();
55
+ /// assert_eq!(iter.next().unwrap(), (&10, &100));
56
+ /// assert_eq!(iter.next().unwrap(), (&20, &200));
57
+ /// assert_eq!(iter.next().unwrap(), (&30, &300));
58
+ /// assert!(iter.next().is_none());
59
+ /// }
113
60
///
114
- /// Ok(())
61
+ /// // Print all elements.
62
+ /// for (key, value) in &tree {
63
+ /// pr_info!("{} = {}\n", key, value);
64
+ /// }
65
+ ///
66
+ /// // Replace one of the elements.
67
+ /// tree.try_insert(10, 1000)?;
68
+ ///
69
+ /// // Check that the tree reflects the replacement.
70
+ /// {
71
+ /// let mut iter = tree.iter();
72
+ /// assert_eq!(iter.next().unwrap(), (&10, &1000));
73
+ /// assert_eq!(iter.next().unwrap(), (&20, &200));
74
+ /// assert_eq!(iter.next().unwrap(), (&30, &300));
75
+ /// assert!(iter.next().is_none());
76
+ /// }
77
+ ///
78
+ /// // Change the value of one of the elements.
79
+ /// *tree.get_mut(&30).unwrap() = 3000;
80
+ ///
81
+ /// // Check that the tree reflects the update.
82
+ /// {
83
+ /// let mut iter = tree.iter();
84
+ /// assert_eq!(iter.next().unwrap(), (&10, &1000));
85
+ /// assert_eq!(iter.next().unwrap(), (&20, &200));
86
+ /// assert_eq!(iter.next().unwrap(), (&30, &3000));
87
+ /// assert!(iter.next().is_none());
88
+ /// }
89
+ ///
90
+ /// // Remove an element.
91
+ /// tree.remove(&10);
92
+ ///
93
+ /// // Check that the tree reflects the removal.
94
+ /// {
95
+ /// let mut iter = tree.iter();
96
+ /// assert_eq!(iter.next().unwrap(), (&20, &200));
97
+ /// assert_eq!(iter.next().unwrap(), (&30, &3000));
98
+ /// assert!(iter.next().is_none());
99
+ /// }
100
+ ///
101
+ /// // Update all values.
102
+ /// for value in tree.values_mut() {
103
+ /// *value *= 10;
104
+ /// }
105
+ ///
106
+ /// // Check that the tree reflects the changes to values.
107
+ /// {
108
+ /// let mut iter = tree.iter();
109
+ /// assert_eq!(iter.next().unwrap(), (&20, &2000));
110
+ /// assert_eq!(iter.next().unwrap(), (&30, &30000));
111
+ /// assert!(iter.next().is_none());
115
112
/// }
113
+ ///
114
+ /// # Ok(())
115
+ /// # }
116
+ /// #
117
+ /// # assert_eq!(test(), Ok(()));
116
118
/// ```
117
119
///
118
120
/// In the example below, we first allocate a node, acquire a spinlock, then insert the node into
@@ -141,53 +143,55 @@ struct Node<K, V> {
141
143
/// # use kernel::prelude::*;
142
144
/// use kernel::rbtree::RBTree;
143
145
///
144
- /// fn reuse_test() -> Result {
145
- /// // Create a new tree.
146
- /// let mut tree = RBTree::new();
147
- ///
148
- /// // Insert three elements.
149
- /// tree.try_insert(20, 200)?;
150
- /// tree.try_insert(10, 100)?;
151
- /// tree.try_insert(30, 300)?;
152
- ///
153
- /// // Check the nodes we just inserted.
154
- /// {
155
- /// let mut iter = tree.iter();
156
- /// assert_eq!(iter.next().unwrap(), (&10, &100));
157
- /// assert_eq!(iter.next().unwrap(), (&20, &200));
158
- /// assert_eq!(iter.next().unwrap(), (&30, &300));
159
- /// assert!(iter.next().is_none());
160
- /// }
161
- ///
162
- /// // Remove a node, getting back ownership of it.
163
- /// let existing = tree.remove_node(&30).unwrap();
164
- ///
165
- /// // Check that the tree reflects the removal.
166
- /// {
167
- /// let mut iter = tree.iter();
168
- /// assert_eq!(iter.next().unwrap(), (&10, &100));
169
- /// assert_eq!(iter.next().unwrap(), (&20, &200));
170
- /// assert!(iter.next().is_none());
171
- /// }
172
- ///
173
- /// // Turn the node into a reservation so that we can reuse it with a different key/value.
174
- /// let reservation = existing.into_reservation();
175
- ///
176
- /// // Insert a new node into the tree, reusing the previous allocation. This is guaranteed to
177
- /// // succeed (no memory allocations).
178
- /// tree.insert(reservation.into_node(15, 150));
179
- ///
180
- /// // Check that the tree reflect the new insertion.
181
- /// {
182
- /// let mut iter = tree.iter();
183
- /// assert_eq!(iter.next().unwrap(), (&10, &100));
184
- /// assert_eq!(iter.next().unwrap(), (&15, &150));
185
- /// assert_eq!(iter.next().unwrap(), (&20, &200));
186
- /// assert!(iter.next().is_none());
187
- /// }
146
+ /// # fn test() -> Result {
147
+ /// // Create a new tree.
148
+ /// let mut tree = RBTree::new();
149
+ ///
150
+ /// // Insert three elements.
151
+ /// tree.try_insert(20, 200)?;
152
+ /// tree.try_insert(10, 100)?;
153
+ /// tree.try_insert(30, 300)?;
154
+ ///
155
+ /// // Check the nodes we just inserted.
156
+ /// {
157
+ /// let mut iter = tree.iter();
158
+ /// assert_eq!(iter.next().unwrap(), (&10, &100));
159
+ /// assert_eq!(iter.next().unwrap(), (&20, &200));
160
+ /// assert_eq!(iter.next().unwrap(), (&30, &300));
161
+ /// assert!(iter.next().is_none());
162
+ /// }
188
163
///
189
- /// Ok(())
164
+ /// // Remove a node, getting back ownership of it.
165
+ /// let existing = tree.remove_node(&30).unwrap();
166
+ ///
167
+ /// // Check that the tree reflects the removal.
168
+ /// {
169
+ /// let mut iter = tree.iter();
170
+ /// assert_eq!(iter.next().unwrap(), (&10, &100));
171
+ /// assert_eq!(iter.next().unwrap(), (&20, &200));
172
+ /// assert!(iter.next().is_none());
173
+ /// }
174
+ ///
175
+ /// // Turn the node into a reservation so that we can reuse it with a different key/value.
176
+ /// let reservation = existing.into_reservation();
177
+ ///
178
+ /// // Insert a new node into the tree, reusing the previous allocation. This is guaranteed to
179
+ /// // succeed (no memory allocations).
180
+ /// tree.insert(reservation.into_node(15, 150));
181
+ ///
182
+ /// // Check that the tree reflect the new insertion.
183
+ /// {
184
+ /// let mut iter = tree.iter();
185
+ /// assert_eq!(iter.next().unwrap(), (&10, &100));
186
+ /// assert_eq!(iter.next().unwrap(), (&15, &150));
187
+ /// assert_eq!(iter.next().unwrap(), (&20, &200));
188
+ /// assert!(iter.next().is_none());
190
189
/// }
190
+ ///
191
+ /// # Ok(())
192
+ /// # }
193
+ /// #
194
+ /// # assert_eq!(test(), Ok(()));
191
195
/// ```
192
196
pub struct RBTree < K , V > {
193
197
root : bindings:: rb_root ,
0 commit comments