rust_utils/
slice.rs

1use crate::sealed::Sealed;
2
3impl<T> Sealed for [T] {}
4
5pub trait SliceExt<T>: Sealed {
6    fn get2_mut(&mut self, i: usize, j: usize) -> Option<(&mut T, &mut T)>;
7}
8
9impl<T> SliceExt<T> for [T] {
10    fn get2_mut(&mut self, i: usize, j: usize) -> Option<(&mut T, &mut T)> {
11        if i == j || i >= self.len() || j >= self.len() {
12            return None;
13        }
14        // SAFETY: `i` and `j` are in bounds and not equal
15        unsafe {
16            let ptr = self.as_mut_ptr();
17            Some((&mut *ptr.add(i), &mut *ptr.add(j)))
18        }
19    }
20}