@@ -25,23 +25,25 @@ fn create[T]() -> t[T] {
25
25
* elsewhere.
26
26
*/
27
27
28
- fn grow[ T ] ( uint nelts, uint lo, vec[ mutable cell[ T ] ] elts) ->
29
- vec[ mutable cell[ T ] ] {
30
- assert ( nelts == vec:: len ( elts) ) ;
31
- // FIXME: Making the vector argument an alias is a workaround for
32
- // issue #375
28
+ fn grow[ T ] ( uint nelts, uint lo, & ( cell[ T ] ) [ mutable] elts)
29
+ -> ( cell[ T ] ) [ mutable] {
30
+ assert ( nelts == ivec:: len ( elts) ) ;
31
+ auto rv = ~[ mutable] ;
33
32
34
- fn fill[ T ] ( uint i, uint nelts, uint lo, & vec[ mutable cell[ T ] ] old) ->
35
- cell[ T ] {
36
- ret if ( i < nelts) {
37
- old. ( ( lo + i) % nelts)
38
- } else { option:: none } ;
33
+ auto i = 0 u;
34
+ auto nalloc = uint:: next_power_of_two ( nelts + 1 u) ;
35
+ while ( i < nalloc) {
36
+ if ( i < nelts) {
37
+ rv += ~[ mutable elts. ( ( lo + i) % nelts) ] ;
38
+ } else {
39
+ rv += ~[ mutable option:: none] ;
40
+ }
41
+ i += 1 u;
39
42
}
40
- let uint nalloc = uint:: next_power_of_two ( nelts + 1 u) ;
41
- let vec:: init_op[ cell[ T ] ] copy_op = bind fill[ T ] ( _, nelts, lo, elts) ;
42
- ret vec:: init_fn_mut[ cell[ T ] ] ( copy_op, nalloc) ;
43
+
44
+ ret rv;
43
45
}
44
- fn get[ T ] ( vec [ mutable cell[ T ] ] elts, uint i) -> T {
46
+ fn get[ T ] ( & ( cell[ T ] ) [ mutable ] elts, uint i) -> T {
45
47
ret alt ( elts. ( i) ) {
46
48
case ( option:: some ( ?t) ) { t }
47
49
case ( _) { fail }
@@ -50,16 +52,16 @@ fn create[T]() -> t[T] {
50
52
obj deque[ T ] ( mutable uint nelts,
51
53
mutable uint lo,
52
54
mutable uint hi,
53
- mutable vec [ mutable cell[ T ] ] elts) {
55
+ mutable ( cell[ T ] ) [ mutable ] elts) {
54
56
fn size ( ) -> uint { ret nelts; }
55
57
fn add_front ( & T t) {
56
58
let uint oldlo = lo;
57
59
if ( lo == 0 u) {
58
- lo = vec :: len[ cell[ T ] ] ( elts) - 1 u;
60
+ lo = ivec :: len[ cell[ T ] ] ( elts) - 1 u;
59
61
} else { lo -= 1 u; }
60
62
if ( lo == hi) {
61
63
elts = grow[ T ] ( nelts, oldlo, elts) ;
62
- lo = vec :: len[ cell[ T ] ] ( elts) - 1 u;
64
+ lo = ivec :: len[ cell[ T ] ] ( elts) - 1 u;
63
65
hi = nelts;
64
66
}
65
67
elts. ( lo) = option:: some[ T ] ( t) ;
@@ -72,7 +74,7 @@ fn create[T]() -> t[T] {
72
74
hi = nelts;
73
75
}
74
76
elts. ( hi) = option:: some[ T ] ( t) ;
75
- hi = ( hi + 1 u) % vec :: len[ cell[ T ] ] ( elts) ;
77
+ hi = ( hi + 1 u) % ivec :: len[ cell[ T ] ] ( elts) ;
76
78
nelts += 1 u;
77
79
}
78
80
@@ -83,14 +85,16 @@ fn create[T]() -> t[T] {
83
85
fn pop_front ( ) -> T {
84
86
let T t = get[ T ] ( elts, lo) ;
85
87
elts. ( lo) = option:: none[ T ] ;
86
- lo = ( lo + 1 u) % vec :: len[ cell[ T ] ] ( elts) ;
88
+ lo = ( lo + 1 u) % ivec :: len[ cell[ T ] ] ( elts) ;
87
89
nelts -= 1 u;
88
90
ret t;
89
91
}
90
92
fn pop_back ( ) -> T {
91
93
if ( hi == 0 u) {
92
- hi = vec:: len[ cell[ T ] ] ( elts) - 1 u;
93
- } else { hi -= 1 u; }
94
+ hi = ivec:: len[ cell[ T ] ] ( elts) - 1 u;
95
+ } else {
96
+ hi -= 1 u;
97
+ }
94
98
let T t = get[ T ] ( elts, hi) ;
95
99
elts. ( hi) = option:: none[ T ] ;
96
100
nelts -= 1 u;
@@ -99,12 +103,12 @@ fn create[T]() -> t[T] {
99
103
fn peek_front ( ) -> T { ret get[ T ] ( elts, lo) ; }
100
104
fn peek_back ( ) -> T { ret get[ T ] ( elts, hi - 1 u) ; }
101
105
fn get ( int i) -> T {
102
- let uint idx = ( lo + ( i as uint ) ) % vec :: len[ cell[ T ] ] ( elts) ;
106
+ let uint idx = ( lo + ( i as uint ) ) % ivec :: len[ cell[ T ] ] ( elts) ;
103
107
ret get[ T ] ( elts, idx) ;
104
108
}
105
109
}
106
- let vec [ mutable cell[ T ] ] v =
107
- vec :: init_elt_mut ( option:: none, initial_capacity) ;
110
+ let ( cell[ T ] ) [ mutable ] v =
111
+ ivec :: init_elt_mut ( option:: none, initial_capacity) ;
108
112
ret deque[ T ] ( 0 u, 0 u, 0 u, v) ;
109
113
}
110
114
// Local Variables:
0 commit comments