diff options
| author | Crozet Sébastien <developer@crozet.re> | 2021-03-13 18:00:58 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2021-03-13 18:00:58 +0100 |
| commit | 3a1502be74901f3df96a05a7d479f15bd4f8b507 (patch) | |
| tree | bfa1ceb9664ddb853e94e9b1983388e4a2195faf /src/utils.rs | |
| parent | a967ace7d426eea11b4132328574cc3a48790ea5 (diff) | |
| download | rapier-3a1502be74901f3df96a05a7d479f15bd4f8b507.tar.gz rapier-3a1502be74901f3df96a05a7d479f15bd4f8b507.tar.bz2 rapier-3a1502be74901f3df96a05a7d479f15bd4f8b507.zip | |
First complete implementation of the hierarchical SAP.
Diffstat (limited to 'src/utils.rs')
| -rw-r--r-- | src/utils.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/utils.rs b/src/utils.rs index 4ed89f6..c1eb31d 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -3,6 +3,7 @@ use na::{Matrix3, Point2, Point3, Scalar, SimdRealField, Vector2, Vector3}; use num::Zero; use simba::simd::SimdValue; +use std::ops::IndexMut; use parry::utils::SdpMatrix3; use { @@ -676,3 +677,34 @@ pub(crate) fn select_other<T: PartialEq>(pair: (T, T), elt: T) -> T { pair.0 } } + +/// Methods for simultaneously indexing a container with two distinct indices. +pub trait IndexMut2<I>: IndexMut<I> { + /// Gets mutable references to two distinct elements of the container. + /// + /// Panics if `i == j`. + fn index_mut2(&mut self, i: usize, j: usize) -> (&mut Self::Output, &mut Self::Output); + + /// Gets a mutable reference to one element, and immutable reference to a second one. + /// + /// Panics if `i == j`. + #[inline] + fn index_mut_const(&mut self, i: usize, j: usize) -> (&mut Self::Output, &Self::Output) { + let (a, b) = self.index_mut2(i, j); + (a, &*b) + } +} + +impl<T> IndexMut2<usize> for Vec<T> { + #[inline] + fn index_mut2(&mut self, i: usize, j: usize) -> (&mut T, &mut T) { + assert!(i != j, "Unable to index the same element twice."); + assert!(i < self.len() && j < self.len(), "Index out of bounds."); + + unsafe { + let a = &mut *(self.get_unchecked_mut(i) as *mut _); + let b = &mut *(self.get_unchecked_mut(j) as *mut _); + (a, b) + } + } +} |
