@@ -109,6 +109,84 @@ impl<T: GetLinks + ?Sized> GetLinks for Arc<T> {
109
109
///
110
110
/// Elements in the list are wrapped and ownership is transferred to the list while the element is
111
111
/// in the list.
112
+ ///
113
+ /// # Examples
114
+ ///
115
+ /// In the example below we create a list of numbers, implement `GetLinks` for
116
+ /// it and perform several operations on the list:
117
+ ///
118
+ /// ```
119
+ /// use kernel::linked_list::{GetLinks, Links, List, Wrapper};
120
+ /// use kernel::sync::Arc;
121
+ ///
122
+ /// struct NumList {
123
+ /// num: i32,
124
+ /// links: Links<NumList>,
125
+ /// }
126
+ ///
127
+ /// // We need to implement GetLinks for our list indicating:
128
+ /// impl GetLinks for NumList {
129
+ /// // The type of the entries of the list:
130
+ /// type EntryType = Self;
131
+ /// // And how to get the link to the previous and next items:
132
+ /// fn get_links(data: &Self) -> &Links<Self> {
133
+ /// &data.links
134
+ /// }
135
+ /// }
136
+ ///
137
+ /// let first_item = Arc::try_new(NumList {
138
+ /// num: 1,
139
+ /// links: Links::new(),
140
+ /// })?;
141
+ ///
142
+ /// let second_item = Arc::try_new(NumList {
143
+ /// num: 2,
144
+ /// links: Links::new(),
145
+ /// })?;
146
+ ///
147
+ /// let third_item = Arc::try_new(NumList {
148
+ /// num: 3,
149
+ /// links: Links::new(),
150
+ /// })?;
151
+ ///
152
+ /// let mut list: List<Arc<NumList>> = List::new();
153
+ /// assert!(list.is_empty());
154
+ ///
155
+ /// list.push_back(first_item.clone());
156
+ /// assert!(!list.is_empty());
157
+ ///
158
+ /// // Pushing the same item twice has no effect
159
+ /// list.push_back(first_item.clone());
160
+ ///
161
+ /// unsafe { list.remove(&first_item) };
162
+ /// assert!(list.is_empty());
163
+ ///
164
+ /// list.push_back(second_item.clone());
165
+ /// assert!(!list.is_empty());
166
+ ///
167
+ /// unsafe { list.insert_after(second_item.into_pointer(), third_item) };
168
+ ///
169
+ /// // At this point `second_item` and `third_item` are in the list with values
170
+ /// // 2 and 3. Decrease their values by 1.
171
+ /// let mut cursor = list.cursor_front_mut();
172
+ /// while let Some(item) = cursor.current() {
173
+ /// item.num -= 1;
174
+ /// cursor.move_next();
175
+ /// }
176
+ ///
177
+ /// let item = list.pop_front().unwrap();
178
+ /// assert_eq!(1, item.num);
179
+ ///
180
+ /// let item = list.pop_front().unwrap();
181
+ /// assert_eq!(2, item.num);
182
+ ///
183
+ /// assert!(list.is_empty());
184
+ ///
185
+ /// let item = list.pop_front();
186
+ /// assert!(item.is_none());
187
+ ///
188
+ /// # Ok::<(), Error>(())
189
+ /// ```
112
190
pub struct List < G : GetLinksWrapped > {
113
191
list : RawList < G > ,
114
192
}
0 commit comments