From f5bb3ad07a57ce1bef06d10bba061638e90a3d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Thu, 22 Oct 2026 20:30:24 +0200 Subject: [PATCH] Change generate_as and petersen to return Vecs instead of arrays --- src/generators.rs | 61 ++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/src/generators.rs b/src/generators.rs index e64942d..2c7a94c 100644 --- a/src/generators.rs +++ b/src/generators.rs @@ -3,11 +3,11 @@ use crate::models::AppendGraph; use crate::traits::{GraphTopology, GraphTopologyAddition, GraphTopologyConversion}; -/// Builds a graph of type `G` by running a generator on a temporary [`AppendGraph`]. +/// Builds a graph of type `G` by running a generator on a temporary graph. /// -/// `generate_as` fills a temporary graph and converts it to `G`. It returns the handles of the -/// elements it created as handles of the resulting graph. This makes it possible to obtain graph -/// types directly that do not implement [`GraphTopologyAddition`], such as [`FrozenGraph`]. +/// `generate_as` fills a temporary [`AppendGraph`] and converts it to `G`. It returns the handles +/// of the elements it created as handles of the resulting graph. This makes it possible to obtain +/// graph types directly that do not implement [`GraphTopologyAddition`], such as [`FrozenGraph`]. /// /// # Examples /// @@ -16,21 +16,26 @@ use crate::traits::{GraphTopology, GraphTopologyAddition, GraphTopologyConversio /// use grapherity::generators; /// use grapherity::models::FrozenGraph; /// -/// let (graph, vertices, edges) = generators::generate_as::(generators::petersen); +/// // Generates a parameterless Petersen graph as a FrozenGraph model. +/// let (graph, vertices, edges) = generators::generate_as::(generators::petersen); /// assert_eq!(graph.vertex_count(), 10); -/// assert_eq!(graph.edge_count(), 15); /// assert!(graph.vertices().all(|v| graph.degree(v) == 3)); +/// +/// // Generates a parameterized complete graph as a FrozenGraph model. +/// let (graph, vertices, edges) = generators::generate_as::(|g| generators::complete(g, 5)); +/// assert_eq!(graph.vertex_count(), 5); +/// assert!(graph.vertices().all(|v| graph.degree(v) == 4)); /// ``` /// /// [`FrozenGraph`]: crate::models::FrozenGraph -pub fn generate_as( +pub fn generate_as( generator: impl FnOnce( &mut AppendGraph, ) -> ( - [::Vertex; V], - [::Edge; E], + Vec<::Vertex>, + Vec<::Edge>, ), -) -> (G, [G::Vertex; V], [G::Edge; E]) +) -> (G, Vec, Vec) where G: GraphTopologyConversion, { @@ -39,8 +44,8 @@ where let (graph, iso) = G::convert(&builder); ( graph, - vertices.map(|v| iso.vertex(v)), - edges.map(|e| iso.edge(e)), + vertices.into_iter().map(|v| iso.vertex(v)).collect(), + edges.into_iter().map(|e| iso.edge(e)).collect(), ) } @@ -112,27 +117,29 @@ pub fn complete(graph: &mut G, n: usize) -> (Vec(graph: &mut G) -> ([G::Vertex; 10], [G::Edge; 15]) { +pub fn petersen(graph: &mut G) -> (Vec, Vec) { const N: usize = 5; const K: usize = 2; graph.reserve_vertices(10); graph.reserve_edges(15); - let vertices = core::array::from_fn(|_| graph.add_vertex()); - let edges = core::array::from_fn(|j| { - let i = j / 3; - match j % 3 { - 0 => { - let outer = if i < N - 1 { i + 1 } else { 0 }; - graph.add_edge(vertices[i], vertices[outer]) + let vertices: Vec<_> = (0..10).map(|_| graph.add_vertex()).collect(); + let edges = (0..15) + .map(|j| { + let i = j / 3; + match j % 3 { + 0 => { + let outer = if i < N - 1 { i + 1 } else { 0 }; + graph.add_edge(vertices[i], vertices[outer]) + } + 1 => { + let inner = if i < N - K { i + N + K } else { i + K }; + graph.add_edge(vertices[i + N], vertices[inner]) + } + _ => graph.add_edge(vertices[i], vertices[i + N]), } - 1 => { - let inner = if i < N - K { i + N + K } else { i + K }; - graph.add_edge(vertices[i + N], vertices[inner]) - } - _ => graph.add_edge(vertices[i], vertices[i + N]), - } - }); + }) + .collect(); (vertices, edges) }