@@ -120,13 +120,12 @@ impl<I: Idx, T> IndexSlice<I, T> {
120120 pub fn pick2_mut ( & mut self , a : I , b : I ) -> ( & mut T , & mut T ) {
121121 let ( ai, bi) = ( a. index ( ) , b. index ( ) ) ;
122122 assert ! ( ai != bi) ;
123+ let len = self . raw . len ( ) ;
124+ assert ! ( ai < len && bi < len) ;
123125
124- if ai < bi {
125- let ( c1, c2) = self . raw . split_at_mut ( bi) ;
126- ( & mut c1[ ai] , & mut c2[ 0 ] )
127- } else {
128- let ( c2, c1) = self . pick2_mut ( b, a) ;
129- ( c1, c2)
126+ match self . raw . get_disjoint_mut ( [ ai, bi] ) {
127+ Ok ( [ a, b] ) => ( a, b) ,
128+ Err ( _) => panic ! ( "Can't get mutable references" ) ,
130129 }
131130 }
132131
@@ -139,8 +138,11 @@ impl<I: Idx, T> IndexSlice<I, T> {
139138 assert ! ( ai != bi && bi != ci && ci != ai) ;
140139 let len = self . raw . len ( ) ;
141140 assert ! ( ai < len && bi < len && ci < len) ;
142- let ptr = self . raw . as_mut_ptr ( ) ;
143- unsafe { ( & mut * ptr. add ( ai) , & mut * ptr. add ( bi) , & mut * ptr. add ( ci) ) }
141+
142+ match self . raw . get_disjoint_mut ( [ ai, bi, ci] ) {
143+ Ok ( [ a, b, c] ) => ( a, b, c) ,
144+ Err ( _) => panic ! ( "Can't get mutable references" ) ,
145+ }
144146 }
145147
146148 #[ inline]
0 commit comments