1
1
use std:: mem:: MaybeUninit ;
2
2
3
+ mod clone;
3
4
mod drop;
4
5
mod index;
5
6
mod from;
6
7
mod deref;
7
8
mod iter;
8
9
mod extend;
10
+ mod eq;
9
11
10
- #[ derive( Debug ) ]
11
12
/// A fixed-capacity vector that directly stores its elements
12
- pub struct LocalVec < T , const N : usize > {
13
+ #[ derive( Eq , PartialEq , Clone , Debug ) ]
14
+ pub struct LocalVec < T , const N : usize > ( LocalVecImpl < T , N > ) ;
15
+
16
+ /// /// A fixed-capacity vector, for Copy types, that directly stores its elements
17
+ #[ derive( Eq , PartialEq , Copy , Clone , Debug ) ]
18
+ pub struct CopyLocalVec < T : Copy , const N : usize > ( LocalVecImpl < T , N > ) ;
19
+
20
+ #[ derive( Copy , Debug ) ]
21
+ pub struct LocalVecImpl < T , const N : usize > {
13
22
buf : [ MaybeUninit < T > ; N ] ,
14
- len : usize ,
23
+ len : LenType ,
15
24
}
16
25
26
+ // TODO use instead of usize
27
+ type LenType = usize ;
28
+
17
29
impl < T , const N : usize > LocalVec < T , N > {
18
30
pub fn new ( ) -> Self {
31
+ Self ( LocalVecImpl :: new ( ) )
32
+ }
33
+
34
+ pub fn from_array < const M : usize > ( arr : [ T ; M ] ) -> Self {
35
+ Self ( LocalVecImpl :: from_array ( arr) )
36
+ }
37
+ }
38
+
39
+ impl < T : Copy , const N : usize > CopyLocalVec < T , N > {
40
+ pub fn new ( ) -> Self {
41
+ Self ( LocalVecImpl :: new ( ) )
42
+ }
43
+
44
+ pub fn from_array < const M : usize > ( arr : [ T ; M ] ) -> Self {
45
+ Self ( LocalVecImpl :: from_array ( arr) )
46
+ }
47
+ }
48
+
49
+ impl < T , const N : usize > LocalVecImpl < T , N > {
50
+ fn new ( ) -> Self {
19
51
let buf: [ MaybeUninit < T > ; N ] = unsafe {
20
52
MaybeUninit :: uninit ( ) . assume_init ( )
21
53
} ;
22
54
23
- LocalVec {
55
+ LocalVecImpl {
24
56
buf,
25
57
len : 0 ,
26
58
}
27
59
}
28
60
29
61
// TODO implement From<[T; N]> on top of this?
30
- pub fn from_array < const M : usize > ( arr : [ T ; M ] ) -> Self {
62
+ fn from_array < const M : usize > ( arr : [ T ; M ] ) -> Self {
31
63
// TODO check at compile time
32
64
assert ! ( M <= N , "can't store {} elements with a capacity of {}" , M , N ) ;
33
65
@@ -122,21 +154,49 @@ impl<T, const N: usize> LocalVec<T, N> {
122
154
}
123
155
}
124
156
157
+ impl < T , const N : usize > std:: ops:: Deref for LocalVec < T , N > {
158
+ type Target = LocalVecImpl < T , N > ;
159
+
160
+ fn deref ( & self ) -> & Self :: Target {
161
+ & self . 0
162
+ }
163
+ }
164
+
165
+ impl < T : Copy , const N : usize > std:: ops:: Deref for CopyLocalVec < T , N > {
166
+ type Target = LocalVecImpl < T , N > ;
167
+
168
+ fn deref ( & self ) -> & Self :: Target {
169
+ & self . 0
170
+ }
171
+ }
172
+
173
+ impl < T , const N : usize > std:: ops:: DerefMut for LocalVec < T , N > {
174
+ fn deref_mut ( & mut self ) -> & mut Self :: Target {
175
+ & mut self . 0
176
+ }
177
+ }
178
+
179
+ impl < T : Copy , const N : usize > std:: ops:: DerefMut for CopyLocalVec < T , N > {
180
+ fn deref_mut ( & mut self ) -> & mut Self :: Target {
181
+ & mut self . 0
182
+ }
183
+ }
184
+
125
185
#[ cfg( test) ]
126
186
mod tests {
127
- use super :: LocalVec ;
187
+ use super :: LocalVecImpl ;
128
188
129
189
#[ test]
130
190
fn test_new ( ) {
131
- let vec = LocalVec :: < u32 , 4 > :: new ( ) ;
191
+ let vec = LocalVecImpl :: < u32 , 4 > :: new ( ) ;
132
192
assert_eq ! ( vec. len( ) , 0 ) ;
133
193
assert_eq ! ( vec. capacity( ) , 4 ) ;
134
194
}
135
195
136
196
#[ test]
137
197
#[ should_panic]
138
198
fn test_push_on_full ( ) {
139
- let mut vec = LocalVec :: < _ , 1 > :: new ( ) ;
199
+ let mut vec = LocalVecImpl :: < _ , 1 > :: new ( ) ;
140
200
vec. push ( 0 ) ;
141
201
142
202
assert ! ( vec. is_full( ) ) ;
@@ -146,7 +206,7 @@ mod tests {
146
206
147
207
#[ test]
148
208
fn test_push ( ) {
149
- let mut vec = LocalVec :: < _ , 3 > :: new ( ) ;
209
+ let mut vec = LocalVecImpl :: < _ , 3 > :: new ( ) ;
150
210
151
211
assert ! ( vec. is_empty( ) ) ;
152
212
assert_eq ! ( vec. len( ) , 0 ) ;
@@ -164,7 +224,7 @@ mod tests {
164
224
165
225
#[ test]
166
226
fn test_pop_on_empty ( ) {
167
- let mut vec = LocalVec :: < _ , 1 > :: new ( ) ;
227
+ let mut vec = LocalVecImpl :: < _ , 1 > :: new ( ) ;
168
228
assert ! ( vec. is_empty( ) ) ;
169
229
matches ! ( vec. pop( ) , None ) ;
170
230
@@ -178,7 +238,7 @@ mod tests {
178
238
179
239
#[ test]
180
240
fn test_push_and_pop ( ) {
181
- let mut vec = LocalVec :: < _ , 4 > :: new ( ) ;
241
+ let mut vec = LocalVecImpl :: < _ , 4 > :: new ( ) ;
182
242
assert ! ( vec. is_empty( ) ) ;
183
243
matches ! ( vec. pop( ) , None ) ;
184
244
@@ -195,7 +255,7 @@ mod tests {
195
255
196
256
#[ test]
197
257
fn test_clear ( ) {
198
- let mut vec = LocalVec :: < _ , 3 > :: new ( ) ;
258
+ let mut vec = LocalVecImpl :: < _ , 3 > :: new ( ) ;
199
259
vec. clear ( ) ;
200
260
assert ! ( vec. is_empty( ) ) ;
201
261
@@ -214,29 +274,29 @@ mod tests {
214
274
#[ should_panic]
215
275
fn test_from_capacity_exceeding_array ( ) {
216
276
let arr = [ 0 ; 4 ] ;
217
- let _ = LocalVec :: < _ , 3 > :: from_array ( arr) ;
277
+ let _ = LocalVecImpl :: < _ , 3 > :: from_array ( arr) ;
218
278
}
219
279
220
280
#[ test]
221
281
fn test_from_array ( ) {
222
282
let arr = [ 0 ; 4 ] ;
223
- let vec = LocalVec :: < _ , 4 > :: from_array ( arr) ;
283
+ let vec = LocalVecImpl :: < _ , 4 > :: from_array ( arr) ;
224
284
225
285
assert_eq ! ( vec. len( ) , 4 ) ;
226
286
}
227
287
228
288
#[ test]
229
289
fn test_from_smaller_array ( ) {
230
290
let arr = [ 0 ; 4 ] ;
231
- let vec = LocalVec :: < _ , 6 > :: from_array ( arr) ;
291
+ let vec = LocalVecImpl :: < _ , 6 > :: from_array ( arr) ;
232
292
233
293
assert_eq ! ( vec. len( ) , 4 ) ;
234
294
}
235
295
236
296
#[ test]
237
297
fn test_set_len ( ) {
238
298
let arr = [ 7 ; 4 ] ;
239
- let mut vec = LocalVec :: < _ , 6 > :: from_array ( arr) ;
299
+ let mut vec = LocalVecImpl :: < _ , 6 > :: from_array ( arr) ;
240
300
241
301
assert_eq ! ( vec. len( ) , 4 ) ;
242
302
unsafe {
@@ -248,7 +308,7 @@ mod tests {
248
308
#[ test]
249
309
fn test_take_array ( ) {
250
310
let arr = [ 7 ; 4 ] ;
251
- let mut vec = LocalVec :: < _ , 6 > :: from_array ( arr) ;
311
+ let mut vec = LocalVecImpl :: < _ , 6 > :: from_array ( arr) ;
252
312
assert_eq ! ( vec. len( ) , 4 ) ;
253
313
let _ = vec. take_array ( ) ;
254
314
assert_eq ! ( vec. len( ) , 0 ) ;
@@ -257,29 +317,29 @@ mod tests {
257
317
#[ test]
258
318
fn test_as_ptr ( ) {
259
319
let arr = [ 0xff ; 3 ] ;
260
- let vec = LocalVec :: < _ , 8 > :: from_array ( arr) ;
320
+ let vec = LocalVecImpl :: < _ , 8 > :: from_array ( arr) ;
261
321
let ptr = vec. as_ptr ( ) ;
262
322
assert_eq ! ( ptr, & vec[ 0 ] as * const i32 ) ;
263
323
}
264
324
265
325
#[ test]
266
326
fn test_as_mut_ptr ( ) {
267
327
let arr = [ 0xff ; 3 ] ;
268
- let mut vec = LocalVec :: < _ , 8 > :: from_array ( arr) ;
328
+ let mut vec = LocalVecImpl :: < _ , 8 > :: from_array ( arr) ;
269
329
let ptr = vec. as_mut_ptr ( ) ;
270
330
assert_eq ! ( ptr, & mut vec[ 0 ] as * mut i32 ) ;
271
331
}
272
332
273
333
#[ test]
274
334
fn test_as_ptr_zero_size ( ) {
275
- let vec = LocalVec :: < u8 , 0 > :: new ( ) ;
335
+ let vec = LocalVecImpl :: < u8 , 0 > :: new ( ) ;
276
336
let ptr = vec. as_ptr ( ) ;
277
337
assert ! ( ptr. is_null( ) ) ;
278
338
}
279
339
280
340
#[ test]
281
341
fn test_as_mut_ptr_zero_size ( ) {
282
- let mut vec = LocalVec :: < u8 , 0 > :: new ( ) ;
342
+ let mut vec = LocalVecImpl :: < u8 , 0 > :: new ( ) ;
283
343
let ptr = vec. as_mut_ptr ( ) ;
284
344
assert ! ( ptr. is_null( ) ) ;
285
345
}
0 commit comments