@@ -120,13 +120,12 @@ impl<I: Idx, T> IndexSlice<I, T> {
120
120
pub fn pick2_mut ( & mut self , a : I , b : I ) -> ( & mut T , & mut T ) {
121
121
let ( ai, bi) = ( a. index ( ) , b. index ( ) ) ;
122
122
assert ! ( ai != bi) ;
123
+ let len = self . raw . len ( ) ;
124
+ assert ! ( ai < len && bi < len) ;
123
125
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" ) ,
130
129
}
131
130
}
132
131
@@ -139,8 +138,11 @@ impl<I: Idx, T> IndexSlice<I, T> {
139
138
assert ! ( ai != bi && bi != ci && ci != ai) ;
140
139
let len = self . raw . len ( ) ;
141
140
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
+ }
144
146
}
145
147
146
148
#[ inline]
0 commit comments