From e034f304553d2af2e39cb6439e7270fc1eae3b07 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Thu, 31 Oct 2024 11:35:43 -0400 Subject: [PATCH] Self doesn't need to be mutable when visting rule inputs --- crates/graph/src/lib.rs | 48 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/crates/graph/src/lib.rs b/crates/graph/src/lib.rs index 78fc57d..28e5cfe 100644 --- a/crates/graph/src/lib.rs +++ b/crates/graph/src/lib.rs @@ -408,7 +408,7 @@ pub struct ErasedNode { any: Box, is_valid: Box) -> bool>, invalidate: Box) -> ()>, - visit_inputs: Box, &mut dyn FnMut(NodeIndex) -> ()) -> ()>, + visit_inputs: Box, &mut dyn FnMut(NodeIndex) -> ()) -> ()>, update: Synch::UpdateFn, } @@ -428,7 +428,7 @@ impl ErasedNode { x.invalidate(); }), visit_inputs: Box::new(|any, visitor| { - let x = any.downcast_mut::>>().unwrap(); + let x = any.downcast_ref::>>().unwrap(); x.visit_inputs(visitor); }), update: S::make_update_fn::(), @@ -447,15 +447,15 @@ impl ErasedNode { fn invalidate(&mut self) { (self.invalidate)(&mut self.any); } - fn visit_inputs(&mut self, f: &mut dyn FnMut(NodeIndex) -> ()) { - (self.visit_inputs)(&mut self.any, f); + fn visit_inputs(&self, f: &mut dyn FnMut(NodeIndex) -> ()) { + (self.visit_inputs)(&self.any, f); } } trait Node { fn is_valid(&self) -> bool; fn invalidate(&mut self); - fn visit_inputs(&mut self, visitor: &mut dyn FnMut(NodeIndex) -> ()); + fn visit_inputs(&self, visitor: &mut dyn FnMut(NodeIndex) -> ()); fn update(&mut self) -> Synch::UpdateResult<'_>; fn value_rc(&self) -> Rc>>; } @@ -481,7 +481,7 @@ impl Node for ConstNode { fn invalidate(&mut self) {} - fn visit_inputs(&mut self, _visitor: &mut dyn FnMut(NodeIndex) -> ()) {} + fn visit_inputs(&self, _visitor: &mut dyn FnMut(NodeIndex) -> ()) {} fn update(&mut self) -> ::UpdateResult<'_> { unreachable!() @@ -519,10 +519,10 @@ impl Node for RuleNode self.valid = false; } - fn visit_inputs(&mut self, visitor: &mut dyn FnMut(NodeIndex) -> ()) { + fn visit_inputs(&self, visitor: &mut dyn FnMut(NodeIndex) -> ()) { struct InputIndexVisitor<'a>(&'a mut dyn FnMut(NodeIndex) -> ()); impl<'a> InputVisitor for InputIndexVisitor<'a> { - fn visit(&mut self, input: &mut Input) { + fn visit(&mut self, input: &Input) { self.0(input.node_idx); } } @@ -569,10 +569,10 @@ where self.valid = false; } - fn visit_inputs(&mut self, visitor: &mut dyn FnMut(NodeIndex) -> ()) { + fn visit_inputs(&self, visitor: &mut dyn FnMut(NodeIndex) -> ()) { struct InputIndexVisitor<'a>(&'a mut dyn FnMut(NodeIndex) -> ()); impl<'a> InputVisitor for InputIndexVisitor<'a> { - fn visit(&mut self, input: &mut Input) { + fn visit(&mut self, input: &Input) { self.0(input.node_idx); } } @@ -599,7 +599,7 @@ impl AsyncRuleNode { pub trait Rule: 'static { type Output; - fn visit_inputs(&mut self, visitor: &mut impl InputVisitor); + fn visit_inputs(&self, visitor: &mut impl InputVisitor); fn evaluate(&mut self) -> Self::Output; } @@ -607,13 +607,13 @@ pub trait Rule: 'static { pub trait AsyncRule: 'static { type Output: 'static; - fn visit_inputs(&mut self, visitor: &mut impl InputVisitor); + fn visit_inputs(&self, visitor: &mut impl InputVisitor); async fn evaluate(&mut self) -> Self::Output; } pub trait InputVisitor { - fn visit(&mut self, input: &mut Input); + fn visit(&mut self, input: &Input); } #[cfg(test)] @@ -630,7 +630,7 @@ mod tests { struct ConstantRule(i32); impl Rule for ConstantRule { type Output = i32; - fn visit_inputs(&mut self, _visitor: &mut impl InputVisitor) {} + fn visit_inputs(&self, _visitor: &mut impl InputVisitor) {} fn evaluate(&mut self) -> i32 { self.0 } @@ -656,8 +656,8 @@ mod tests { struct Double(Input); impl Rule for Double { type Output = i32; - fn visit_inputs(&mut self, visitor: &mut impl InputVisitor) { - visitor.visit(&mut self.0); + fn visit_inputs(&self, visitor: &mut impl InputVisitor) { + visitor.visit(&self.0); } fn evaluate(&mut self) -> i32 { self.0.value() * 2 @@ -683,7 +683,7 @@ mod tests { struct Inc(i32); impl Rule for Inc { type Output = i32; - fn visit_inputs(&mut self, _visitor: &mut impl InputVisitor) {} + fn visit_inputs(&self, _visitor: &mut impl InputVisitor) {} fn evaluate(&mut self) -> i32 { self.0 += 1; return self.0; @@ -711,9 +711,9 @@ mod tests { struct Add(Input, Input); impl Rule for Add { type Output = i32; - fn visit_inputs(&mut self, visitor: &mut impl InputVisitor) { - visitor.visit(&mut self.0); - visitor.visit(&mut self.1); + fn visit_inputs(&self, visitor: &mut impl InputVisitor) { + visitor.visit(&self.0); + visitor.visit(&self.1); } fn evaluate(&mut self) -> i32 { self.0.value() + self.1.value() @@ -759,9 +759,9 @@ mod tests { struct DeferredInput(Rc>>>); impl Rule for DeferredInput { type Output = i32; - fn visit_inputs(&mut self, visitor: &mut impl InputVisitor) { - let mut borrowed = self.0.borrow_mut(); - let input = borrowed.as_mut().unwrap(); + fn visit_inputs(&self, visitor: &mut impl InputVisitor) { + let borrowed = self.0.borrow(); + let input = borrowed.as_ref().unwrap(); visitor.visit(input); } fn evaluate(&mut self) -> i32 { @@ -830,7 +830,7 @@ mod tests { struct AsyncConst(i32); impl AsyncRule for AsyncConst { type Output = i32; - fn visit_inputs(&mut self, _visitor: &mut impl InputVisitor) {} + fn visit_inputs(&self, _visitor: &mut impl InputVisitor) {} async fn evaluate(&mut self) -> i32 { self.0 }