diff options
| author | Sébastien Crozet <developer@crozet.re> | 2021-02-24 16:17:17 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-24 16:17:17 +0100 |
| commit | 8e40ab758d85f2dcb46b8346178abd13829961a5 (patch) | |
| tree | 98a08e662c8e2fba8c88c19cfcb2f2aa05ce5d2c | |
| parent | 649eba10130673534a60b17a0343b15208e5d622 (diff) | |
| parent | 277d74fb1891950a7a80c2052a2b044521d91e2f (diff) | |
| download | rapier-8e40ab758d85f2dcb46b8346178abd13829961a5.tar.gz rapier-8e40ab758d85f2dcb46b8346178abd13829961a5.tar.bz2 rapier-8e40ab758d85f2dcb46b8346178abd13829961a5.zip | |
Merge pull request #123 from EmbarkStudios/modify-joints
Add JointSet::get_mut and get_unknown_gen_mut
| -rw-r--r-- | src/dynamics/joint/joint_set.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/dynamics/joint/joint_set.rs b/src/dynamics/joint/joint_set.rs index ed3e69a..b3a0fd9 100644 --- a/src/dynamics/joint/joint_set.rs +++ b/src/dynamics/joint/joint_set.rs @@ -76,6 +76,12 @@ impl JointSet { self.joint_graph.graph.edge_weight(*id) } + /// Gets a mutable reference to the joint with the given handle. + pub fn get_mut(&mut self, handle: JointHandle) -> Option<&mut Joint> { + let id = self.joint_ids.get(handle.0)?; + self.joint_graph.graph.edge_weight_mut(*id) + } + /// Gets the joint with the given handle without a known generation. /// /// This is useful when you know you want the joint at position `i` but @@ -93,6 +99,23 @@ impl JointSet { )) } + /// Gets a mutable reference to the joint with the given handle without a known generation. + /// + /// This is useful when you know you want the joint at position `i` but + /// don't know what is its current generation number. Generation numbers are + /// used to protect from the ABA problem because the joint position `i` + /// are recycled between two insertion and a removal. + /// + /// Using this is discouraged in favor of `self.get_mut(handle)` which does not + /// suffer form the ABA problem. + pub fn get_unknown_gen_mut(&mut self, i: usize) -> Option<(&mut Joint, JointHandle)> { + let (id, handle) = self.joint_ids.get_unknown_gen(i)?; + Some(( + self.joint_graph.graph.edge_weight_mut(*id)?, + JointHandle(handle), + )) + } + /// Iterates through all the joint on this set. pub fn iter(&self) -> impl Iterator<Item = (JointHandle, &Joint)> { self.joint_graph |
