13
13
14
14
use std:: cast;
15
15
use std:: cmp;
16
+ use std:: ptr;
16
17
use std:: util;
17
18
use std:: iterator:: FromIterator ;
18
19
19
20
/// A doubly-linked list
20
21
pub struct List < T > {
21
22
priv length : uint ,
22
23
priv list_head : Link < T > ,
23
- priv list_tail : Rawlink < T > ,
24
+ priv list_tail : Rawlink < Node < T > > ,
24
25
}
25
26
26
27
type Link < T > = Option < ~Node < T > > ;
27
- type Rawlink < T > = Option < & ' static Node < T > > ;
28
- // Rawlink uses &'static to have a small Option<&'> represenation.
29
- // FIXME: Use a raw pointer like *mut Node if possible.
30
- // FIXME: Causes infinite recursion in %? repr
28
+ struct Rawlink < T > { priv p: * mut T }
31
29
32
30
struct Node < T > {
33
31
priv next : Link < T > ,
34
- priv prev : Rawlink < T > ,
32
+ priv prev : Rawlink < Node < T > > ,
35
33
priv value : T ,
36
34
}
37
35
@@ -45,21 +43,21 @@ pub struct ForwardIterator<'self, T> {
45
43
/// List reverse iterator
46
44
pub struct ReverseIterator < ' self , T > {
47
45
priv list : & ' self List < T > ,
48
- priv next : Rawlink < T > ,
46
+ priv next : Rawlink < Node < T > > ,
49
47
priv nelem : uint ,
50
48
}
51
49
52
50
/// List mutable iterator
53
51
pub struct MutForwardIterator < ' self , T > {
54
52
priv list : & ' self mut List < T > ,
55
- priv curs : Rawlink < T > ,
53
+ priv curs : Rawlink < Node < T > > ,
56
54
priv nelem : uint ,
57
55
}
58
56
59
57
/// List mutable reverse iterator
60
58
pub struct MutReverseIterator < ' self , T > {
61
59
priv list : & ' self mut List < T > ,
62
- priv next : Rawlink < T > ,
60
+ priv next : Rawlink < Node < T > > ,
63
61
priv nelem : uint ,
64
62
}
65
63
@@ -73,6 +71,33 @@ pub struct ConsumeRevIterator<T> {
73
71
priv list : List < T >
74
72
}
75
73
74
+ /// Rawlink is a type like Option<T> but for holding a raw pointer
75
+ impl < T > Rawlink < T > {
76
+ /// Like Option::None for Rawlink
77
+ fn none ( ) -> Rawlink < T > {
78
+ Rawlink { p : ptr:: mut_null ( ) }
79
+ }
80
+
81
+ /// Like Option::Some for Rawlink
82
+ fn some ( n : & mut T ) -> Rawlink < T > {
83
+ Rawlink { p : ptr:: to_mut_unsafe_ptr ( n) }
84
+ }
85
+
86
+ /// Convert the `Rawlink` into an Option value
87
+ fn resolve_immut ( & self ) -> Option < & T > {
88
+ unsafe { self . p . to_option ( ) }
89
+ }
90
+
91
+ /// Convert the `Rawlink` into an Option value
92
+ fn resolve ( & mut self ) -> Option < & mut T > {
93
+ if self . p . is_null ( ) {
94
+ None
95
+ } else {
96
+ Some ( unsafe { cast:: transmute ( self . p ) } )
97
+ }
98
+ }
99
+ }
100
+
76
101
impl < T > Container for List < T > {
77
102
/// O(1)
78
103
fn is_empty ( & self ) -> bool {
@@ -93,19 +118,11 @@ impl<T> Mutable for List<T> {
93
118
}
94
119
}
95
120
96
- /// Cast the raw link into a borrowed ref
97
- fn resolve_rawlink < T > ( lnk : & ' static Node < T > ) -> & mut Node < T > {
98
- unsafe { cast:: transmute_mut ( lnk) }
99
- }
100
- fn rawlink < T > ( n : & mut Node < T > ) -> Rawlink < T > {
101
- Some ( unsafe { cast:: transmute ( n) } )
102
- }
103
-
104
121
impl < T > List < T > {
105
122
/// Create an empty List
106
123
#[ inline]
107
124
pub fn new ( ) -> List < T > {
108
- List { list_head : None , list_tail : None , length : 0 }
125
+ List { list_head : None , list_tail : Rawlink :: none ( ) , length : 0 }
109
126
}
110
127
111
128
/// Provide a reference to the front element, or None if the list is empty
@@ -123,30 +140,29 @@ impl<T> List<T> {
123
140
124
141
/// Provide a reference to the back element, or None if the list is empty
125
142
pub fn peek_back < ' a > ( & ' a self ) -> Option < & ' a T > {
126
- match self . list_tail {
143
+ match self . list_tail . resolve_immut ( ) {
127
144
None => None ,
128
- Some ( tail) => Some ( & resolve_rawlink ( tail) . value ) ,
145
+ Some ( tail) => Some ( & tail. value ) ,
129
146
}
130
147
}
131
148
132
149
/// Provide a mutable reference to the back element, or None if the list is empty
133
150
pub fn peek_back_mut < ' a > ( & ' a mut self ) -> Option < & ' a mut T > {
134
- match self . list_tail {
151
+ match self . list_tail . resolve ( ) {
135
152
None => None ,
136
- Some ( tail) => Some ( & mut resolve_rawlink ( tail) . value ) ,
153
+ Some ( tail) => Some ( & mut tail. value ) ,
137
154
}
138
155
}
139
156
140
157
/// Add an element last in the list
141
158
///
142
159
/// O(1)
143
160
pub fn push_back ( & mut self , elt : T ) {
144
- match self . list_tail {
161
+ match self . list_tail . resolve ( ) {
145
162
None => return self . push_front ( elt) ,
146
- Some ( rtail ) => {
163
+ Some ( tail ) => {
147
164
let mut new_tail = ~Node { value : elt, next : None , prev : self . list_tail } ;
148
- self . list_tail = rawlink ( new_tail) ;
149
- let tail = resolve_rawlink ( rtail) ;
165
+ self . list_tail = Rawlink :: some ( new_tail) ;
150
166
tail. next = Some ( new_tail) ;
151
167
}
152
168
}
@@ -158,19 +174,18 @@ impl<T> List<T> {
158
174
/// O(1)
159
175
#[ inline]
160
176
pub fn pop_back ( & mut self ) -> Option < T > {
161
- match self . list_tail {
177
+ match self . list_tail . resolve ( ) {
162
178
None => None ,
163
- Some ( rtail ) => {
179
+ Some ( tail ) => {
164
180
self . length -= 1 ;
165
- let tail = resolve_rawlink ( rtail) ;
166
- let tail_own = match tail. prev {
181
+ let tail_own = match tail. prev . resolve ( ) {
167
182
None => {
168
- self . list_tail = None ;
183
+ self . list_tail = Rawlink :: none ( ) ;
169
184
self . list_head . swap_unwrap ( )
170
185
} ,
171
- Some ( rtail_prev ) => {
186
+ Some ( tail_prev ) => {
172
187
self . list_tail = tail. prev ;
173
- resolve_rawlink ( rtail_prev ) . next . swap_unwrap ( )
188
+ tail_prev . next . swap_unwrap ( )
174
189
}
175
190
} ;
176
191
Some ( tail_own. value )
@@ -182,14 +197,14 @@ impl<T> List<T> {
182
197
///
183
198
/// O(1)
184
199
pub fn push_front ( & mut self , elt : T ) {
185
- let mut new_head = ~Node { value : elt, next : None , prev : None } ;
200
+ let mut new_head = ~Node { value : elt, next : None , prev : Rawlink :: none ( ) } ;
186
201
match self . list_head {
187
202
None => {
188
- self . list_tail = rawlink ( new_head) ;
203
+ self . list_tail = Rawlink :: some ( new_head) ;
189
204
self . list_head = Some ( new_head) ;
190
205
}
191
206
Some ( ref mut head) => {
192
- head. prev = rawlink ( new_head) ;
207
+ head. prev = Rawlink :: some ( new_head) ;
193
208
util:: swap ( head, & mut new_head) ;
194
209
head. next = Some ( new_head) ;
195
210
}
@@ -208,12 +223,12 @@ impl<T> List<T> {
208
223
match * head. swap_unwrap ( ) {
209
224
Node { value : value, next : Some ( next) , prev : _} => {
210
225
let mut mnext = next;
211
- mnext. prev = None ;
226
+ mnext. prev = Rawlink :: none ( ) ;
212
227
* head = Some ( mnext) ;
213
228
Some ( value)
214
229
}
215
230
Node { value : value, next : None , prev : _} => {
216
- self . list_tail = None ;
231
+ self . list_tail = Rawlink :: none ( ) ;
217
232
* head = None ;
218
233
Some ( value)
219
234
}
@@ -226,14 +241,13 @@ impl<T> List<T> {
226
241
///
227
242
/// O(1)
228
243
pub fn append ( & mut self , other : List < T > ) {
229
- match self . list_tail {
244
+ match self . list_tail . resolve ( ) {
230
245
None => * self = other,
231
- Some ( rtail ) => {
246
+ Some ( tail ) => {
232
247
match other {
233
248
List { list_head : None , list_tail : _, length : _} => return ,
234
249
List { list_head : Some ( node) , list_tail : o_tail, length : o_length} => {
235
250
let mut lnk_node = node;
236
- let tail = resolve_rawlink ( rtail) ;
237
251
lnk_node. prev = self . list_tail ;
238
252
tail. next = Some ( lnk_node) ;
239
253
self . list_tail = o_tail;
@@ -301,7 +315,7 @@ impl<T> List<T> {
301
315
302
316
/// Provide a forward iterator with mutable references
303
317
pub fn mut_iter < ' a > ( & ' a mut self ) -> MutForwardIterator < ' a , T > {
304
- MutForwardIterator { nelem : self . len ( ) , list : self , curs : None }
318
+ MutForwardIterator { nelem : self . len ( ) , list : self , curs : Rawlink :: none ( ) }
305
319
}
306
320
307
321
/// Provide a reverse iterator with mutable references
@@ -353,23 +367,23 @@ impl<'self, A> Iterator<&'self A> for ForwardIterator<'self, A> {
353
367
impl < ' self , A > Iterator < & ' self mut A > for MutForwardIterator < ' self , A > {
354
368
#[ inline]
355
369
fn next ( & mut self ) -> Option < & ' self mut A > {
356
- match self . curs {
370
+ match self . curs . resolve ( ) {
357
371
None => {
358
372
match self . list . list_head {
359
373
None => None ,
360
374
Some ( ref mut head) => {
361
375
self . nelem -= 1 ;
362
- self . curs = rawlink ( & mut * * head) ;
376
+ self . curs = Rawlink :: some ( * head) ;
363
377
Some ( & mut head. value )
364
378
}
365
379
}
366
380
}
367
- Some ( rcurs ) => {
368
- match resolve_rawlink ( rcurs ) . next {
381
+ Some ( curs ) => {
382
+ match curs . next {
369
383
None => None ,
370
384
Some ( ref mut head) => {
371
385
self . nelem -= 1 ;
372
- self . curs = rawlink ( & mut * * head) ;
386
+ self . curs = Rawlink :: some ( * head) ;
373
387
Some ( & mut head. value )
374
388
}
375
389
}
@@ -385,11 +399,10 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
385
399
impl < ' self , A > Iterator < & ' self A > for ReverseIterator < ' self , A > {
386
400
#[ inline]
387
401
fn next ( & mut self ) -> Option < & ' self A > {
388
- match self . next {
402
+ match self . next . resolve ( ) {
389
403
None => None ,
390
- Some ( rnext ) => {
404
+ Some ( prev ) => {
391
405
self . nelem -= 1 ;
392
- let prev = resolve_rawlink ( rnext) ;
393
406
self . next = prev. prev ;
394
407
Some ( & prev. value )
395
408
}
@@ -404,11 +417,10 @@ impl<'self, A> Iterator<&'self A> for ReverseIterator<'self, A> {
404
417
impl < ' self , A > Iterator < & ' self mut A > for MutReverseIterator < ' self , A > {
405
418
#[ inline]
406
419
fn next ( & mut self ) -> Option < & ' self mut A > {
407
- match self . next {
420
+ match self . next . resolve ( ) {
408
421
None => None ,
409
- Some ( rnext ) => {
422
+ Some ( prev ) => {
410
423
self . nelem -= 1 ;
411
- let prev = resolve_rawlink ( rnext) ;
412
424
self . next = prev. prev ;
413
425
Some ( & mut prev. value )
414
426
}
@@ -428,19 +440,18 @@ trait ListInsertCursor<A> {
428
440
429
441
impl < ' self , A > ListInsertCursor < A > for MutForwardIterator < ' self , A > {
430
442
fn insert_before ( & mut self , elt : A ) {
431
- match self . curs {
443
+ match self . curs . resolve ( ) {
432
444
None => self . list . push_front ( elt) ,
433
- Some ( rcurs) => {
434
- let node = resolve_rawlink ( rcurs) ;
435
- let prev_node = match node. prev {
445
+ Some ( node) => {
446
+ let prev_node = match node. prev . resolve ( ) {
436
447
None => return self . list . push_front ( elt) , // at head
437
- Some ( rprev ) => resolve_rawlink ( rprev ) ,
448
+ Some ( prev ) => prev ,
438
449
} ;
439
450
let mut node_own = prev_node. next . swap_unwrap ( ) ;
440
451
let mut ins_node = ~Node { value : elt,
441
452
next : None ,
442
- prev : rawlink ( prev_node) } ;
443
- node_own. prev = rawlink ( ins_node) ;
453
+ prev : Rawlink :: some ( prev_node) } ;
454
+ node_own. prev = Rawlink :: some ( ins_node) ;
444
455
ins_node. next = Some ( node_own) ;
445
456
prev_node. next = Some ( ins_node) ;
446
457
self . list . length += 1 ;
@@ -497,11 +508,11 @@ fn check_links<T>(list: &List<T>) {
497
508
Some ( ref node) => node_ptr = & * * node,
498
509
}
499
510
loop {
500
- match ( last_ptr, node_ptr. prev ) {
511
+ match ( last_ptr, node_ptr. prev . resolve_immut ( ) ) {
501
512
( None , None ) => { }
502
513
( None , _ ) => fail ! ( "prev link for list_head" ) ,
503
514
( Some ( p) , Some ( pptr) ) => {
504
- assert_eq ! ( ( p as * Node <T >) as uint , pptr as * Node <T > as uint ) ;
515
+ assert_eq ! ( p as * Node <T >, pptr as * Node <T >) ;
505
516
}
506
517
_ => fail ! ( "prev link is none, not good" ) ,
507
518
}
0 commit comments