@@ -9,8 +9,7 @@ use std::ops::{Deref, DerefMut, RangeBounds};
9
9
use std:: slice;
10
10
use std:: vec;
11
11
12
- use crate :: idx:: Idx ;
13
- use crate :: slice:: IndexSlice ;
12
+ use crate :: { Idx , IndexSlice } ;
14
13
15
14
/// An owned contiguous collection of `T`s, indexed by `I` rather than by `usize`.
16
15
///
@@ -25,30 +24,6 @@ pub struct IndexVec<I: Idx, T> {
25
24
_marker : PhantomData < fn ( & I ) > ,
26
25
}
27
26
28
- // Whether `IndexVec` is `Send` depends only on the data,
29
- // not the phantom data.
30
- unsafe impl < I : Idx , T > Send for IndexVec < I , T > where T : Send { }
31
-
32
- #[ cfg( feature = "rustc_serialize" ) ]
33
- impl < S : Encoder , I : Idx , T : Encodable < S > > Encodable < S > for IndexVec < I , T > {
34
- fn encode ( & self , s : & mut S ) {
35
- Encodable :: encode ( & self . raw , s) ;
36
- }
37
- }
38
-
39
- #[ cfg( feature = "rustc_serialize" ) ]
40
- impl < D : Decoder , I : Idx , T : Decodable < D > > Decodable < D > for IndexVec < I , T > {
41
- fn decode ( d : & mut D ) -> Self {
42
- IndexVec { raw : Decodable :: decode ( d) , _marker : PhantomData }
43
- }
44
- }
45
-
46
- impl < I : Idx , T : fmt:: Debug > fmt:: Debug for IndexVec < I , T > {
47
- fn fmt ( & self , fmt : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
48
- fmt:: Debug :: fmt ( & self . raw , fmt)
49
- }
50
- }
51
-
52
27
impl < I : Idx , T > IndexVec < I , T > {
53
28
#[ inline]
54
29
pub fn new ( ) -> Self {
@@ -183,13 +158,45 @@ impl<I: Idx, T> IndexVec<I, T> {
183
158
& mut self [ elem]
184
159
}
185
160
161
+ #[ inline]
162
+ pub fn resize ( & mut self , new_len : usize , value : T )
163
+ where
164
+ T : Clone ,
165
+ {
166
+ self . raw . resize ( new_len, value)
167
+ }
168
+
186
169
#[ inline]
187
170
pub fn resize_to_elem ( & mut self , elem : I , fill_value : impl FnMut ( ) -> T ) {
188
171
let min_new_len = elem. index ( ) + 1 ;
189
172
self . raw . resize_with ( min_new_len, fill_value) ;
190
173
}
191
174
}
192
175
176
+ /// `IndexVec` is often used as a map, so it provides some map-like APIs.
177
+ impl < I : Idx , T > IndexVec < I , Option < T > > {
178
+ #[ inline]
179
+ pub fn insert ( & mut self , index : I , value : T ) -> Option < T > {
180
+ self . ensure_contains_elem ( index, || None ) . replace ( value)
181
+ }
182
+
183
+ #[ inline]
184
+ pub fn get_or_insert_with ( & mut self , index : I , value : impl FnOnce ( ) -> T ) -> & mut T {
185
+ self . ensure_contains_elem ( index, || None ) . get_or_insert_with ( value)
186
+ }
187
+
188
+ #[ inline]
189
+ pub fn remove ( & mut self , index : I ) -> Option < T > {
190
+ self . get_mut ( index) ?. take ( )
191
+ }
192
+ }
193
+
194
+ impl < I : Idx , T : fmt:: Debug > fmt:: Debug for IndexVec < I , T > {
195
+ fn fmt ( & self , fmt : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
196
+ fmt:: Debug :: fmt ( & self . raw , fmt)
197
+ }
198
+ }
199
+
193
200
impl < I : Idx , T > Deref for IndexVec < I , T > {
194
201
type Target = IndexSlice < I , T > ;
195
202
@@ -218,38 +225,6 @@ impl<I: Idx, T> BorrowMut<IndexSlice<I, T>> for IndexVec<I, T> {
218
225
}
219
226
}
220
227
221
- /// `IndexVec` is often used as a map, so it provides some map-like APIs.
222
- impl < I : Idx , T > IndexVec < I , Option < T > > {
223
- #[ inline]
224
- pub fn insert ( & mut self , index : I , value : T ) -> Option < T > {
225
- self . ensure_contains_elem ( index, || None ) . replace ( value)
226
- }
227
-
228
- #[ inline]
229
- pub fn get_or_insert_with ( & mut self , index : I , value : impl FnOnce ( ) -> T ) -> & mut T {
230
- self . ensure_contains_elem ( index, || None ) . get_or_insert_with ( value)
231
- }
232
-
233
- #[ inline]
234
- pub fn remove ( & mut self , index : I ) -> Option < T > {
235
- self . get_mut ( index) ?. take ( )
236
- }
237
- }
238
-
239
- impl < I : Idx , T : Clone > IndexVec < I , T > {
240
- #[ inline]
241
- pub fn resize ( & mut self , new_len : usize , value : T ) {
242
- self . raw . resize ( new_len, value)
243
- }
244
- }
245
-
246
- impl < I : Idx , T > Default for IndexVec < I , T > {
247
- #[ inline]
248
- fn default ( ) -> Self {
249
- Self :: new ( )
250
- }
251
- }
252
-
253
228
impl < I : Idx , T > Extend < T > for IndexVec < I , T > {
254
229
#[ inline]
255
230
fn extend < J : IntoIterator < Item = T > > ( & mut self , iter : J ) {
@@ -279,13 +254,6 @@ impl<I: Idx, T> FromIterator<T> for IndexVec<I, T> {
279
254
}
280
255
}
281
256
282
- impl < I : Idx , T , const N : usize > From < [ T ; N ] > for IndexVec < I , T > {
283
- #[ inline]
284
- fn from ( array : [ T ; N ] ) -> Self {
285
- IndexVec :: from_raw ( array. into ( ) )
286
- }
287
- }
288
-
289
257
impl < I : Idx , T > IntoIterator for IndexVec < I , T > {
290
258
type Item = T ;
291
259
type IntoIter = vec:: IntoIter < T > ;
@@ -316,5 +284,37 @@ impl<'a, I: Idx, T> IntoIterator for &'a mut IndexVec<I, T> {
316
284
}
317
285
}
318
286
287
+ impl < I : Idx , T > Default for IndexVec < I , T > {
288
+ #[ inline]
289
+ fn default ( ) -> Self {
290
+ Self :: new ( )
291
+ }
292
+ }
293
+
294
+ impl < I : Idx , T , const N : usize > From < [ T ; N ] > for IndexVec < I , T > {
295
+ #[ inline]
296
+ fn from ( array : [ T ; N ] ) -> Self {
297
+ IndexVec :: from_raw ( array. into ( ) )
298
+ }
299
+ }
300
+
301
+ #[ cfg( feature = "rustc_serialize" ) ]
302
+ impl < S : Encoder , I : Idx , T : Encodable < S > > Encodable < S > for IndexVec < I , T > {
303
+ fn encode ( & self , s : & mut S ) {
304
+ Encodable :: encode ( & self . raw , s) ;
305
+ }
306
+ }
307
+
308
+ #[ cfg( feature = "rustc_serialize" ) ]
309
+ impl < D : Decoder , I : Idx , T : Decodable < D > > Decodable < D > for IndexVec < I , T > {
310
+ fn decode ( d : & mut D ) -> Self {
311
+ IndexVec { raw : Decodable :: decode ( d) , _marker : PhantomData }
312
+ }
313
+ }
314
+
315
+ // Whether `IndexVec` is `Send` depends only on the data,
316
+ // not the phantom data.
317
+ unsafe impl < I : Idx , T > Send for IndexVec < I , T > where T : Send { }
318
+
319
319
#[ cfg( test) ]
320
320
mod tests;
0 commit comments