aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2021-02-24 16:17:17 +0100
committerGitHub <noreply@github.com>2021-02-24 16:17:17 +0100
commit8e40ab758d85f2dcb46b8346178abd13829961a5 (patch)
tree98a08e662c8e2fba8c88c19cfcb2f2aa05ce5d2c /src
parent649eba10130673534a60b17a0343b15208e5d622 (diff)
parent277d74fb1891950a7a80c2052a2b044521d91e2f (diff)
downloadrapier-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
Diffstat (limited to 'src')
-rw-r--r--src/dynamics/joint/joint_set.rs23
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