1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use super::{Node,Link};
use rust::*;
pub struct Iter<'a, T:'a> {
head : *const Link,
tail : *const Link,
mark : PhantomData<&'a Node<T>>,
}
impl<'a, T:'a> Iterator for Iter<'a, T> {
type Item = &'a Node<T>;
#[inline] fn next( &mut self ) -> Option<&'a Node<T>> {
if self.head.is_null() {
None
} else { unsafe {
let node = self.head;
self.head = if self.head == self.tail {
null()
} else {
(*node).next
};
Some( &*( node as *mut Node<T> ))
}}
}
#[inline] fn size_hint( &self ) -> ( usize, Option<usize> ) {
if self.head.is_null() {
( 0, Some(0) )
} else {
let mut len = 1_usize;
let mut head = self.head;
while head != self.tail {
unsafe{ head = (*head).next; }
len += 1;
}
( len, Some( len ))
}
}
}
impl<'a,T> ExactSizeIterator for Iter<'a, T> {}
impl<'a,T> FusedIterator for Iter<'a, T> {}
impl<'a, T:'a> Iter<'a, T> {
#[inline] pub(crate) fn new( head: *const Link, tail: *const Link ) -> Self {
Iter{ head, tail, mark: PhantomData }
}
}
impl<'a, T> Clone for Iter<'a, T> {
fn clone(&self) -> Self {
Iter { ..*self }
}
}
pub struct IterMut<'a, T:'a> {
head : *mut Link,
tail : *mut Link,
mark : PhantomData<&'a mut Node<T>>,
}
impl<'a, T:'a> Iterator for IterMut<'a, T> {
type Item = &'a mut Node<T>;
#[inline] fn next( &mut self ) -> Option<&'a mut Node<T>> {
if self.head.is_null() {
None
} else { unsafe {
let node = self.head;
self.head = if self.head == self.tail {
null_mut()
} else {
(*node).next
};
Some( &mut *( node as *mut Node<T> ))
}}
}
#[inline] fn size_hint( &self ) -> ( usize, Option<usize> ) {
if self.head.is_null() {
( 0, Some(0) )
} else {
let mut len = 1_usize;
let mut head = self.head;
while head != self.tail {
unsafe{ head = (*head).next; }
len += 1;
}
( len, Some( len ))
}
}
}
impl<'a,T> ExactSizeIterator for IterMut<'a, T> {}
impl<'a,T> FusedIterator for IterMut<'a, T> {}
impl<'a, T:'a> IterMut<'a, T> {
#[inline] pub(crate) fn new( head: *mut Link, tail: *mut Link ) -> Self {
IterMut{ head, tail, mark: PhantomData }
}
}
unsafe impl<'a, T:Sync> Send for Iter<'a, T> {}
unsafe impl<'a, T:Sync> Sync for Iter<'a, T> {}
unsafe impl<'a, T:Send> Send for IterMut<'a, T> {}
unsafe impl<'a, T:Sync> Sync for IterMut<'a, T> {}