pub struct AttributedGraph<N, E> { /* private fields */ }Expand description
A directed graph whose nodes carry data of type N and whose edges carry
data of type E.
Internally, the graph is represented as an adjacency list over NodeId
indices. Parallel edges (same source and target) are supported; the first
matching edge is returned by lookup helpers.
§Example
use scirs2_graph::attributed_graph::{AttributedGraph, NodeId};
#[derive(Debug, Clone)]
struct Person { name: String, age: u32 }
#[derive(Debug, Clone)]
struct Knows { since: u32 }
let mut g: AttributedGraph<Person, Knows> = AttributedGraph::new();
let alice = g.add_node(Person { name: "Alice".into(), age: 30 });
let bob = g.add_node(Person { name: "Bob".into(), age: 25 });
g.add_edge(alice, bob, Knows { since: 2020 }).unwrap();
assert_eq!(g.node_count(), 2);
assert_eq!(g.edge_count(), 1);Implementations§
Source§impl<N, E> AttributedGraph<N, E>
impl<N, E> AttributedGraph<N, E>
Sourcepub fn with_capacity(node_capacity: usize, edge_capacity: usize) -> Self
pub fn with_capacity(node_capacity: usize, edge_capacity: usize) -> Self
Create an empty graph with pre-allocated capacity.
Sourcepub fn add_node(&mut self, data: N) -> NodeId
pub fn add_node(&mut self, data: N) -> NodeId
Add a node with the given data; returns its NodeId.
Sourcepub fn add_edge(&mut self, src: NodeId, dst: NodeId, edge_data: E) -> Result<()>
pub fn add_edge(&mut self, src: NodeId, dst: NodeId, edge_data: E) -> Result<()>
Add a directed edge from src to dst with data edge_data.
Both nodes must already exist.
§Errors
Returns GraphError::NodeNotFound if either node is absent.
Sourcepub fn node_count(&self) -> usize
pub fn node_count(&self) -> usize
Number of nodes.
Sourcepub fn edge_count(&self) -> usize
pub fn edge_count(&self) -> usize
Number of (directed) edges.
Sourcepub fn node_data(&self, id: NodeId) -> Option<&N>
pub fn node_data(&self, id: NodeId) -> Option<&N>
Retrieve node data by id.
Returns None if the id is out of range.
Sourcepub fn node_data_mut(&mut self, id: NodeId) -> Option<&mut N>
pub fn node_data_mut(&mut self, id: NodeId) -> Option<&mut N>
Retrieve mutable node data by id.
Sourcepub fn nodes(&self) -> impl Iterator<Item = (NodeId, &N)>
pub fn nodes(&self) -> impl Iterator<Item = (NodeId, &N)>
Iterate over all node ids and their data.
Sourcepub fn edges_iter(&self) -> impl Iterator<Item = (NodeId, NodeId, &E)>
pub fn edges_iter(&self) -> impl Iterator<Item = (NodeId, NodeId, &E)>
Iterate over all edges as (src, dst, &E).
Sourcepub fn out_neighbors(&self, node: NodeId) -> Result<Vec<(NodeId, &E)>>
pub fn out_neighbors(&self, node: NodeId) -> Result<Vec<(NodeId, &E)>>
Return the direct out-neighbours of node as (target, &E) pairs.
§Errors
Returns GraphError::NodeNotFound if the node is absent.
Trait Implementations§
Source§impl<N: Clone, E: Clone> Clone for AttributedGraph<N, E>
impl<N: Clone, E: Clone> Clone for AttributedGraph<N, E>
Source§fn clone(&self) -> AttributedGraph<N, E>
fn clone(&self) -> AttributedGraph<N, E>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl<N, E> Freeze for AttributedGraph<N, E>
impl<N, E> RefUnwindSafe for AttributedGraph<N, E>where
N: RefUnwindSafe,
E: RefUnwindSafe,
impl<N, E> Send for AttributedGraph<N, E>
impl<N, E> Sync for AttributedGraph<N, E>
impl<N, E> Unpin for AttributedGraph<N, E>
impl<N, E> UnsafeUnpin for AttributedGraph<N, E>
impl<N, E> UnwindSafe for AttributedGraph<N, E>where
N: UnwindSafe,
E: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more