From e8ea01319b3a9032a3f4f69f65e9ca96562b87b9 Mon Sep 17 00:00:00 2001 From: JSDurand Date: Sun, 22 Jan 2023 11:49:47 +0800 Subject: forest: clone correctly Now the forest can detect if a node is packed or cloned, and correctly clones a node in those circumstances. But it still needs to be tested. --- graph/src/builder.rs | 3 +++ graph/src/labelled/binary.rs | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) (limited to 'graph') diff --git a/graph/src/builder.rs b/graph/src/builder.rs index b04e7f6..c5f9252 100644 --- a/graph/src/builder.rs +++ b/graph/src/builder.rs @@ -82,6 +82,9 @@ pub trait BuilderMut { /// Add an edge from the source to the target. fn add_edge(&mut self, source: usize, target: usize, label: Self::Label) -> Result<(), Error>; + /// Set the label of an existing node to a new label. + fn set_label(&mut self, node_id: usize, label: Self::Label) -> Result<(), Error>; + /// Remove an edge from the source to the target. /// /// Since some graphs are labelled, the users are allowed to pass diff --git a/graph/src/labelled/binary.rs b/graph/src/labelled/binary.rs index e3e1943..201dda2 100644 --- a/graph/src/labelled/binary.rs +++ b/graph/src/labelled/binary.rs @@ -551,6 +551,22 @@ impl<'a, T: GraphLabel> BuilderMut for PLGBuilderMut<'a, T> { Ok(()) } + + #[inline] + fn set_label(&mut self, node_id: usize, label: Self::Label) -> Result<(), Error> { + if !self.graph.has_node(node_id) { + return Err(Error::IndexOutOfBounds(node_id, self.nodes_len())); + } + + // node_id is now guaranteed to be valid. + + self.graph.nodes.get_mut(node_id).unwrap().label = label; + + self.graph.label_index_map.remove(&label); + self.graph.label_index_map.insert(label, node_id); + + Ok(()) + } } #[cfg(test)] -- cgit v1.2.3-18-g5258