@@ -140,12 +140,21 @@ impl<T> Node<T> {
140
140
fn new ( v : T ) -> Node < T > {
141
141
Node { value : v, next : None , prev : Rawlink :: none ( ) }
142
142
}
143
+
144
+ /// Update the `prev` link on `next`, then set self's next pointer.
145
+ ///
146
+ /// `self.next` should be `None` when you call this
147
+ /// (otherwise a Node is probably being dropped by mistake).
148
+ fn set_next ( & mut self , mut next : Box < Node < T > > ) {
149
+ debug_assert ! ( self . next. is_none( ) ) ;
150
+ next. prev = Rawlink :: some ( self ) ;
151
+ self . next = Some ( next) ;
152
+ }
143
153
}
144
154
145
- /// Set the .prev field on `next`, then return `Some(next)`
146
- fn link_with_prev < T > ( mut next : Box < Node < T > > , prev : Rawlink < Node < T > > )
147
- -> Link < T > {
148
- next. prev = prev;
155
+ /// Clear the .prev field on `next`, then return `Some(next)`
156
+ fn link_no_prev < T > ( mut next : Box < Node < T > > ) -> Link < T > {
157
+ next. prev = Rawlink :: none ( ) ;
149
158
Some ( next)
150
159
}
151
160
@@ -157,7 +166,7 @@ impl<T> LinkedList<T> {
157
166
match self . list_head {
158
167
None => {
159
168
self . list_tail = Rawlink :: some ( & mut * new_head) ;
160
- self . list_head = link_with_prev ( new_head, Rawlink :: none ( ) ) ;
169
+ self . list_head = link_no_prev ( new_head) ;
161
170
}
162
171
Some ( ref mut head) => {
163
172
new_head. prev = Rawlink :: none ( ) ;
@@ -175,7 +184,7 @@ impl<T> LinkedList<T> {
175
184
self . list_head . take ( ) . map ( |mut front_node| {
176
185
self . length -= 1 ;
177
186
match front_node. next . take ( ) {
178
- Some ( node) => self . list_head = link_with_prev ( node, Rawlink :: none ( ) ) ,
187
+ Some ( node) => self . list_head = link_no_prev ( node) ,
179
188
None => self . list_tail = Rawlink :: none ( )
180
189
}
181
190
front_node
@@ -184,12 +193,12 @@ impl<T> LinkedList<T> {
184
193
185
194
/// Add a Node last in the list
186
195
#[ inline]
187
- fn push_back_node ( & mut self , mut new_tail : Box < Node < T > > ) {
196
+ fn push_back_node ( & mut self , new_tail : Box < Node < T > > ) {
188
197
match unsafe { self . list_tail . resolve_mut ( ) } {
189
198
None => return self . push_front_node ( new_tail) ,
190
199
Some ( tail) => {
191
200
self . list_tail = Rawlink :: some ( & mut * new_tail) ;
192
- tail. next = link_with_prev ( new_tail, Rawlink :: some ( tail ) ) ;
201
+ tail. set_next ( new_tail) ;
193
202
}
194
203
}
195
204
self . length += 1 ;
@@ -267,7 +276,7 @@ impl<T> LinkedList<T> {
267
276
match other. list_head . take ( ) {
268
277
None => return ,
269
278
Some ( node) => {
270
- tail. next = link_with_prev ( node, self . list_tail ) ;
279
+ tail. set_next ( node) ;
271
280
self . list_tail = o_tail;
272
281
self . length += o_length;
273
282
}
@@ -758,8 +767,8 @@ impl<'a, A> IterMut<'a, A> {
758
767
Some ( prev) => prev,
759
768
} ;
760
769
let node_own = prev_node. next . take ( ) . unwrap ( ) ;
761
- ins_node. next = link_with_prev ( node_own, Rawlink :: some ( & mut * ins_node ) ) ;
762
- prev_node. next = link_with_prev ( ins_node, Rawlink :: some ( prev_node ) ) ;
770
+ ins_node. set_next ( node_own) ;
771
+ prev_node. set_next ( ins_node) ;
763
772
self . list . length += 1 ;
764
773
}
765
774
}
0 commit comments