@@ -5,7 +5,7 @@ use std::fmt;
5
5
use std:: fmt:: Debug ;
6
6
use std:: hash:: Hash ;
7
7
use std:: marker:: PhantomData ;
8
- use std:: ops:: { Index , IndexMut , RangeBounds } ;
8
+ use std:: ops:: { Deref , DerefMut , Index , IndexMut , RangeBounds } ;
9
9
use std:: slice;
10
10
use std:: vec;
11
11
@@ -52,15 +52,27 @@ impl Idx for u32 {
52
52
}
53
53
54
54
#[ derive( Clone , PartialEq , Eq , Hash ) ]
55
+ #[ repr( transparent) ]
55
56
pub struct IndexVec < I : Idx , T > {
56
57
pub raw : Vec < T > ,
57
58
_marker : PhantomData < fn ( & I ) > ,
58
59
}
59
60
61
+ #[ derive( PartialEq , Eq , Hash ) ]
62
+ #[ repr( transparent) ]
63
+ pub struct IndexSlice < I : Idx , T > {
64
+ _marker : PhantomData < fn ( & I ) > ,
65
+ pub raw : [ T ] ,
66
+ }
67
+
60
68
// Whether `IndexVec` is `Send` depends only on the data,
61
69
// not the phantom data.
62
70
unsafe impl < I : Idx , T > Send for IndexVec < I , T > where T : Send { }
63
71
72
+ // Whether `IndexSlice` is `Send` depends only on the data,
73
+ // not the phantom data.
74
+ unsafe impl < I : Idx , T > Send for IndexSlice < I , T > where T : Send { }
75
+
64
76
#[ cfg( feature = "rustc_serialize" ) ]
65
77
impl < S : Encoder , I : Idx , T : Encodable < S > > Encodable < S > for IndexVec < I , T > {
66
78
fn encode ( & self , s : & mut S ) {
@@ -122,6 +134,16 @@ impl<I: Idx, T> IndexVec<I, T> {
122
134
Self :: from_raw ( indices. map ( func) . collect ( ) )
123
135
}
124
136
137
+ #[ inline]
138
+ pub fn as_slice ( & self ) -> & IndexSlice < I , T > {
139
+ IndexSlice :: from_raw ( & self . raw )
140
+ }
141
+
142
+ #[ inline]
143
+ pub fn as_mut_slice ( & mut self ) -> & mut IndexSlice < I , T > {
144
+ IndexSlice :: from_raw_mut ( & mut self . raw )
145
+ }
146
+
125
147
#[ inline]
126
148
pub fn push ( & mut self , d : T ) -> I {
127
149
let idx = I :: new ( self . len ( ) ) ;
@@ -135,32 +157,119 @@ impl<I: Idx, T> IndexVec<I, T> {
135
157
}
136
158
137
159
#[ inline]
138
- pub fn len ( & self ) -> usize {
139
- self . raw . len ( )
160
+ pub fn into_iter ( self ) -> vec :: IntoIter < T > {
161
+ self . raw . into_iter ( )
140
162
}
141
163
142
- /// Gives the next index that will be assigned when `push` is
143
- /// called.
144
164
#[ inline]
145
- pub fn next_index ( & self ) -> I {
146
- I :: new ( self . len ( ) )
165
+ pub fn into_iter_enumerated (
166
+ self ,
167
+ ) -> impl DoubleEndedIterator < Item = ( I , T ) > + ExactSizeIterator {
168
+ self . raw . into_iter ( ) . enumerate ( ) . map ( |( n, t) | ( I :: new ( n) , t) )
147
169
}
148
170
149
171
#[ inline]
150
- pub fn is_empty ( & self ) -> bool {
151
- self . raw . is_empty ( )
172
+ pub fn drain < ' a , R : RangeBounds < usize > > (
173
+ & ' a mut self ,
174
+ range : R ,
175
+ ) -> impl Iterator < Item = T > + ' a {
176
+ self . raw . drain ( range)
152
177
}
153
178
154
179
#[ inline]
155
- pub fn into_iter ( self ) -> vec:: IntoIter < T > {
156
- self . raw . into_iter ( )
180
+ pub fn drain_enumerated < ' a , R : RangeBounds < usize > > (
181
+ & ' a mut self ,
182
+ range : R ,
183
+ ) -> impl Iterator < Item = ( I , T ) > + ' a {
184
+ let begin = match range. start_bound ( ) {
185
+ std:: ops:: Bound :: Included ( i) => * i,
186
+ std:: ops:: Bound :: Excluded ( i) => i. checked_add ( 1 ) . unwrap ( ) ,
187
+ std:: ops:: Bound :: Unbounded => 0 ,
188
+ } ;
189
+ self . raw . drain ( range) . enumerate ( ) . map ( move |( n, t) | ( I :: new ( begin + n) , t) )
157
190
}
158
191
159
192
#[ inline]
160
- pub fn into_iter_enumerated (
161
- self ,
162
- ) -> impl DoubleEndedIterator < Item = ( I , T ) > + ExactSizeIterator {
163
- self . raw . into_iter ( ) . enumerate ( ) . map ( |( n, t) | ( I :: new ( n) , t) )
193
+ pub fn shrink_to_fit ( & mut self ) {
194
+ self . raw . shrink_to_fit ( )
195
+ }
196
+
197
+ #[ inline]
198
+ pub fn truncate ( & mut self , a : usize ) {
199
+ self . raw . truncate ( a)
200
+ }
201
+
202
+ pub fn convert_index_type < Ix : Idx > ( self ) -> IndexVec < Ix , T > {
203
+ IndexVec { raw : self . raw , _marker : PhantomData }
204
+ }
205
+
206
+ /// Grows the index vector so that it contains an entry for
207
+ /// `elem`; if that is already true, then has no
208
+ /// effect. Otherwise, inserts new values as needed by invoking
209
+ /// `fill_value`.
210
+ #[ inline]
211
+ pub fn ensure_contains_elem ( & mut self , elem : I , fill_value : impl FnMut ( ) -> T ) {
212
+ let min_new_len = elem. index ( ) + 1 ;
213
+ if self . len ( ) < min_new_len {
214
+ self . raw . resize_with ( min_new_len, fill_value) ;
215
+ }
216
+ }
217
+
218
+ #[ inline]
219
+ pub fn resize_to_elem ( & mut self , elem : I , fill_value : impl FnMut ( ) -> T ) {
220
+ let min_new_len = elem. index ( ) + 1 ;
221
+ self . raw . resize_with ( min_new_len, fill_value) ;
222
+ }
223
+ }
224
+
225
+ impl < I : Idx , T > Deref for IndexVec < I , T > {
226
+ type Target = IndexSlice < I , T > ;
227
+
228
+ #[ inline]
229
+ fn deref ( & self ) -> & Self :: Target {
230
+ self . as_slice ( )
231
+ }
232
+ }
233
+
234
+ impl < I : Idx , T > DerefMut for IndexVec < I , T > {
235
+ #[ inline]
236
+ fn deref_mut ( & mut self ) -> & mut Self :: Target {
237
+ self . as_mut_slice ( )
238
+ }
239
+ }
240
+
241
+ impl < I : Idx , T > IndexSlice < I , T > {
242
+ #[ inline]
243
+ pub fn from_raw ( raw : & [ T ] ) -> & Self {
244
+ let ptr: * const [ T ] = raw;
245
+ // SAFETY: `IndexSlice` is `repr(transparent)` over a normal slice
246
+ unsafe { & * ( ptr as * const Self ) }
247
+ }
248
+
249
+ #[ inline]
250
+ pub fn from_raw_mut ( raw : & mut [ T ] ) -> & mut Self {
251
+ let ptr: * mut [ T ] = raw;
252
+ // SAFETY: `IndexSlice` is `repr(transparent)` over a normal slice
253
+ unsafe { & mut * ( ptr as * mut Self ) }
254
+ }
255
+
256
+ #[ inline]
257
+ pub fn len ( & self ) -> usize {
258
+ self . raw . len ( )
259
+ }
260
+
261
+ /// Gives the next index that will be assigned when `push` is called.
262
+ ///
263
+ /// Manual bounds checks can be done using `idx < slice.next_index()`
264
+ /// (as opposed to `idx.index() < slice.len()`).
265
+ #[ inline]
266
+ pub fn next_index ( & self ) -> I {
267
+ I :: new ( self . len ( ) )
268
+ }
269
+
270
+ #[ inline]
271
+ pub fn is_empty ( & self ) -> bool {
272
+ self . raw . is_empty ( )
164
273
}
165
274
166
275
#[ inline]
@@ -194,47 +303,16 @@ impl<I: Idx, T> IndexVec<I, T> {
194
303
self . raw . iter_mut ( ) . enumerate ( ) . map ( |( n, t) | ( I :: new ( n) , t) )
195
304
}
196
305
197
- #[ inline]
198
- pub fn drain < ' a , R : RangeBounds < usize > > (
199
- & ' a mut self ,
200
- range : R ,
201
- ) -> impl Iterator < Item = T > + ' a {
202
- self . raw . drain ( range)
203
- }
204
-
205
- #[ inline]
206
- pub fn drain_enumerated < ' a , R : RangeBounds < usize > > (
207
- & ' a mut self ,
208
- range : R ,
209
- ) -> impl Iterator < Item = ( I , T ) > + ' a {
210
- let begin = match range. start_bound ( ) {
211
- std:: ops:: Bound :: Included ( i) => * i,
212
- std:: ops:: Bound :: Excluded ( i) => i. checked_add ( 1 ) . unwrap ( ) ,
213
- std:: ops:: Bound :: Unbounded => 0 ,
214
- } ;
215
- self . raw . drain ( range) . enumerate ( ) . map ( move |( n, t) | ( I :: new ( begin + n) , t) )
216
- }
217
-
218
306
#[ inline]
219
307
pub fn last_index ( & self ) -> Option < I > {
220
308
self . len ( ) . checked_sub ( 1 ) . map ( I :: new)
221
309
}
222
310
223
- #[ inline]
224
- pub fn shrink_to_fit ( & mut self ) {
225
- self . raw . shrink_to_fit ( )
226
- }
227
-
228
311
#[ inline]
229
312
pub fn swap ( & mut self , a : I , b : I ) {
230
313
self . raw . swap ( a. index ( ) , b. index ( ) )
231
314
}
232
315
233
- #[ inline]
234
- pub fn truncate ( & mut self , a : usize ) {
235
- self . raw . truncate ( a)
236
- }
237
-
238
316
#[ inline]
239
317
pub fn get ( & self , index : I ) -> Option < & T > {
240
318
self . raw . get ( index. index ( ) )
@@ -274,28 +352,6 @@ impl<I: Idx, T> IndexVec<I, T> {
274
352
let ptr = self . raw . as_mut_ptr ( ) ;
275
353
unsafe { ( & mut * ptr. add ( ai) , & mut * ptr. add ( bi) , & mut * ptr. add ( ci) ) }
276
354
}
277
-
278
- pub fn convert_index_type < Ix : Idx > ( self ) -> IndexVec < Ix , T > {
279
- IndexVec { raw : self . raw , _marker : PhantomData }
280
- }
281
-
282
- /// Grows the index vector so that it contains an entry for
283
- /// `elem`; if that is already true, then has no
284
- /// effect. Otherwise, inserts new values as needed by invoking
285
- /// `fill_value`.
286
- #[ inline]
287
- pub fn ensure_contains_elem ( & mut self , elem : I , fill_value : impl FnMut ( ) -> T ) {
288
- let min_new_len = elem. index ( ) + 1 ;
289
- if self . len ( ) < min_new_len {
290
- self . raw . resize_with ( min_new_len, fill_value) ;
291
- }
292
- }
293
-
294
- #[ inline]
295
- pub fn resize_to_elem ( & mut self , elem : I , fill_value : impl FnMut ( ) -> T ) {
296
- let min_new_len = elem. index ( ) + 1 ;
297
- self . raw . resize_with ( min_new_len, fill_value) ;
298
- }
299
355
}
300
356
301
357
/// `IndexVec` is often used as a map, so it provides some map-like APIs.
@@ -336,7 +392,7 @@ impl<I: Idx, T: Ord> IndexVec<I, T> {
336
392
}
337
393
}
338
394
339
- impl < I : Idx , T > Index < I > for IndexVec < I , T > {
395
+ impl < I : Idx , T > Index < I > for IndexSlice < I , T > {
340
396
type Output = T ;
341
397
342
398
#[ inline]
@@ -345,7 +401,7 @@ impl<I: Idx, T> Index<I> for IndexVec<I, T> {
345
401
}
346
402
}
347
403
348
- impl < I : Idx , T > IndexMut < I > for IndexVec < I , T > {
404
+ impl < I : Idx , T > IndexMut < I > for IndexSlice < I , T > {
349
405
#[ inline]
350
406
fn index_mut ( & mut self , index : I ) -> & mut T {
351
407
& mut self . raw [ index. index ( ) ]
@@ -359,6 +415,20 @@ impl<I: Idx, T> Default for IndexVec<I, T> {
359
415
}
360
416
}
361
417
418
+ impl < I : Idx , T > Default for & IndexSlice < I , T > {
419
+ #[ inline]
420
+ fn default ( ) -> Self {
421
+ IndexSlice :: from_raw ( Default :: default ( ) )
422
+ }
423
+ }
424
+
425
+ impl < I : Idx , T > Default for & mut IndexSlice < I , T > {
426
+ #[ inline]
427
+ fn default ( ) -> Self {
428
+ IndexSlice :: from_raw_mut ( Default :: default ( ) )
429
+ }
430
+ }
431
+
362
432
impl < I : Idx , T > Extend < T > for IndexVec < I , T > {
363
433
#[ inline]
364
434
fn extend < J : IntoIterator < Item = T > > ( & mut self , iter : J ) {
@@ -418,5 +488,25 @@ impl<'a, I: Idx, T> IntoIterator for &'a mut IndexVec<I, T> {
418
488
}
419
489
}
420
490
491
+ impl < ' a , I : Idx , T > IntoIterator for & ' a IndexSlice < I , T > {
492
+ type Item = & ' a T ;
493
+ type IntoIter = slice:: Iter < ' a , T > ;
494
+
495
+ #[ inline]
496
+ fn into_iter ( self ) -> slice:: Iter < ' a , T > {
497
+ self . raw . iter ( )
498
+ }
499
+ }
500
+
501
+ impl < ' a , I : Idx , T > IntoIterator for & ' a mut IndexSlice < I , T > {
502
+ type Item = & ' a mut T ;
503
+ type IntoIter = slice:: IterMut < ' a , T > ;
504
+
505
+ #[ inline]
506
+ fn into_iter ( self ) -> slice:: IterMut < ' a , T > {
507
+ self . raw . iter_mut ( )
508
+ }
509
+ }
510
+
421
511
#[ cfg( test) ]
422
512
mod tests;
0 commit comments