Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/accessor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ impl Child for Accessor {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
43 changes: 42 additions & 1 deletion mir/src/ir/nodes/ops/add.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,51 @@ impl Child for Add {
fn get_parents(&self) -> Vec<BackLink<Self::Parent>> {
self.parents.clone()
}

fn add_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn add_remove_parent_removes_only_target() {
let span = SourceSpan::default();

let lhs: Link<Op> = Op::None(span).into();
let rhs: Link<Op> = Op::None(span).into();

let mut add = Add {
parents: Vec::new(),
lhs,
rhs,
_node: Singleton::default(),
_owner: Singleton::default(),
span,
};

let owner1: Link<Owner> = Owner::None(span).into();
let owner2: Link<Owner> = Owner::None(span).into();

add.add_parent(owner1.clone());
add.add_parent(owner2.clone());
assert_eq!(add.get_parents().len(), 2);

add.remove_parent(owner1.clone());

let parents = add.get_parents();
assert_eq!(parents.len(), 1);
let remaining =
parents[0].to_link().expect("BackLink<Owner> should upgrade to Link<Owner>");
assert_eq!(remaining, owner2);
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/boundary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ impl Child for Boundary {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/bus_op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ impl Child for BusOp {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ impl Child for Call {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/enf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ impl Child for Enf {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/exp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ impl Child for Exp {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/fold.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ impl Child for Fold {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/for_op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ impl Child for For {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/if_op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ impl Child for If {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/matrix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ impl Child for Matrix {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/mul.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ impl Child for Mul {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/parameter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ impl Child for Parameter {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/sub.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ impl Child for Sub {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,10 @@ impl Child for Value {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}

Expand Down
5 changes: 4 additions & 1 deletion mir/src/ir/nodes/ops/vector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ impl Child for Vector {
self.parents.push(parent.into());
}
fn remove_parent(&mut self, parent: Link<Self::Parent>) {
self.parents.retain(|p| *p != parent.clone().into());
self.parents.retain(|p| match p.to_link() {
Some(link) => link != parent,
None => true,
});
}
}