Add From and FromGraph implementations for Graph and AppendGraph

This commit is contained in:
2026-09-28 23:58:30 +02:00
parent a9190f88db
commit 3478274959
3 changed files with 95 additions and 2 deletions
+26 -1
View File
@@ -3,7 +3,8 @@
use std::num::NonZeroUsize;
use crate::maps::ElementMap;
use crate::traits::{GraphTopology, GraphTopologyAddition, Incidence, IncidenceCursor};
use crate::models;
use crate::traits::{FromGraph, GraphTopology, GraphTopologyAddition, Incidence, IncidenceCursor};
/// An opaque handle identifying a vertex in an [`AppendGraph`].
///
@@ -259,14 +260,38 @@ impl GraphTopologyAddition for AppendGraph {
}
}
impl<H: GraphTopology> From<&H> for AppendGraph {
fn from(source: &H) -> Self {
models::build_from_topology::<Self, _>(source, Vertex(usize::MAX), |_, _| {}).0
}
}
impl FromGraph for AppendGraph {
fn from_graph<H: GraphTopology>(
source: &H,
) -> (
Self,
ElementMap<H::Vertex, Vertex>,
ElementMap<H::Edge, Edge>,
) {
let mut edge_map = source.edge_map(Edge(NonZeroUsize::MAX));
let (result, vertex_map) =
models::build_from_topology(source, Vertex(usize::MAX), |e, new_e| edge_map[e] = new_e);
(result, vertex_map, edge_map)
}
}
#[cfg(test)]
mod trait_tests {
use super::AppendGraph;
use crate::models::Graph;
crate::graph_topology_tests!(AppendGraph);
crate::graph_topology_addition_tests!(AppendGraph);
crate::graph_topology_clone_tests!(AppendGraph);
crate::graph_topology_addition_clone_tests!(AppendGraph);
crate::graph_topology_from_graph_tests!(AppendGraph, Graph);
crate::graph_topology_addition_from_graph_tests!(AppendGraph, Graph);
}
#[cfg(test)]
+34 -1
View File
@@ -4,8 +4,10 @@ use std::num::NonZeroUsize;
use typed_generational_arena::{Arena, Index};
use crate::maps::ElementMap;
use crate::models;
use crate::traits::{
GraphTopology, GraphTopologyAddition, GraphTopologyDeletion, Incidence, IncidenceCursor,
FromGraph, GraphTopology, GraphTopologyAddition, GraphTopologyDeletion, Incidence,
IncidenceCursor,
};
/// An opaque handle identifying a vertex in a [`Graph`].
@@ -398,9 +400,38 @@ impl GraphTopologyDeletion for Graph {
}
}
impl<H: GraphTopology> From<&H> for Graph {
fn from(source: &H) -> Self {
models::build_from_topology::<Self, _>(
source,
Vertex::new(usize::MAX, usize::MAX),
|_, _| {},
)
.0
}
}
impl FromGraph for Graph {
fn from_graph<H: GraphTopology>(
source: &H,
) -> (
Self,
ElementMap<H::Vertex, Vertex>,
ElementMap<H::Edge, Edge>,
) {
let mut edge_map = source.edge_map(Edge::new(usize::MAX, usize::MAX));
let (result, vertex_map) =
models::build_from_topology(source, Vertex::new(usize::MAX, usize::MAX), |e, new_e| {
edge_map[e] = new_e
});
(result, vertex_map, edge_map)
}
}
#[cfg(test)]
mod trait_tests {
use super::Graph;
use crate::models::AppendGraph;
crate::graph_topology_tests!(Graph);
crate::graph_topology_addition_tests!(Graph);
@@ -408,6 +439,8 @@ mod trait_tests {
crate::graph_topology_addition_deletion_tests!(Graph);
crate::graph_topology_clone_tests!(Graph);
crate::graph_topology_addition_clone_tests!(Graph);
crate::graph_topology_from_graph_tests!(Graph, AppendGraph);
crate::graph_topology_addition_from_graph_tests!(Graph, AppendGraph);
}
#[cfg(test)]