@@ -9,8 +9,7 @@ use std::ops::{Deref, DerefMut, RangeBounds};
99use std:: slice;
1010use std:: vec;
1111
12- use crate :: idx:: Idx ;
13- use crate :: slice:: IndexSlice ;
12+ use crate :: { Idx , IndexSlice } ;
1413
1514/// An owned contiguous collection of `T`s, indexed by `I` rather than by `usize`.
1615///
@@ -25,30 +24,6 @@ pub struct IndexVec<I: Idx, T> {
2524 _marker : PhantomData < fn ( & I ) > ,
2625}
2726
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-
5227impl < I : Idx , T > IndexVec < I , T > {
5328 #[ inline]
5429 pub fn new ( ) -> Self {
@@ -183,13 +158,45 @@ impl<I: Idx, T> IndexVec<I, T> {
183158 & mut self [ elem]
184159 }
185160
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+
186169 #[ inline]
187170 pub fn resize_to_elem ( & mut self , elem : I , fill_value : impl FnMut ( ) -> T ) {
188171 let min_new_len = elem. index ( ) + 1 ;
189172 self . raw . resize_with ( min_new_len, fill_value) ;
190173 }
191174}
192175
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+
193200impl < I : Idx , T > Deref for IndexVec < I , T > {
194201 type Target = IndexSlice < I , T > ;
195202
@@ -218,38 +225,6 @@ impl<I: Idx, T> BorrowMut<IndexSlice<I, T>> for IndexVec<I, T> {
218225 }
219226}
220227
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-
253228impl < I : Idx , T > Extend < T > for IndexVec < I , T > {
254229 #[ inline]
255230 fn extend < J : IntoIterator < Item = T > > ( & mut self , iter : J ) {
@@ -279,13 +254,6 @@ impl<I: Idx, T> FromIterator<T> for IndexVec<I, T> {
279254 }
280255}
281256
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-
289257impl < I : Idx , T > IntoIterator for IndexVec < I , T > {
290258 type Item = T ;
291259 type IntoIter = vec:: IntoIter < T > ;
@@ -316,5 +284,37 @@ impl<'a, I: Idx, T> IntoIterator for &'a mut IndexVec<I, T> {
316284 }
317285}
318286
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+
319319#[ cfg( test) ]
320320mod tests;
0 commit comments