diff --git a/Cargo.toml b/Cargo.toml index d681f58..04e873c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,14 +7,16 @@ members = [".", "crates/*", "crates/*/fuzz"] resolver = "2" [workspace.dependencies] -bimap = "0.6.3" derive-getters = "0.5" -petgraph = { git = "https://codeberg.org/topola/petgraph.git" } rstar = "0.12" serde_json = "1.0" spade = "2.12" thiserror = "2.0" +[workspace.dependencies.bimap] +version = "0.6.3" +features = ["serde"] + [workspace.dependencies.geo-types] version = "0.7" default-features = false @@ -25,6 +27,10 @@ version = "0.29" default-features = false features = ["spade", "use-serde"] +[workspace.dependencies.petgraph] +git = "https://codeberg.org/topola/petgraph.git" +features = ["serde-1"] + [workspace.dependencies.serde] version = "1" features = ["derive"] diff --git a/src/drawing/graph.rs b/src/drawing/graph.rs index 8b14957..3ecfdde 100644 --- a/src/drawing/graph.rs +++ b/src/drawing/graph.rs @@ -3,7 +3,6 @@ // SPDX-License-Identifier: MIT use enum_dispatch::enum_dispatch; - use petgraph::stable_graph::NodeIndex; use crate::{drawing::Drawing, graph::GetPetgraphIndex}; @@ -90,7 +89,7 @@ macro_rules! impl_loose_weight { // TODO: This enum shouldn't exist: we shouldn't be carrying the tag around like this. Instead we // should be getting it from the graph when it's needed. #[enum_dispatch(GetPetgraphIndex, MakePrimitive)] -#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pub enum PrimitiveIndex { FixedDot(FixedDotIndex), LooseDot(LooseDotIndex), diff --git a/src/geometry/geometry.rs b/src/geometry/geometry.rs index 1d85c74..5846bb5 100644 --- a/src/geometry/geometry.rs +++ b/src/geometry/geometry.rs @@ -12,6 +12,7 @@ use petgraph::{ visit::EdgeRef, Direction::{self, Incoming}, }; +use serde::{Deserialize, Serialize}; use crate::{ drawing::{ @@ -63,7 +64,7 @@ pub enum GeometryLabel { Compound, } -#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] pub enum GenericNode { Primitive(P), Compound(C), diff --git a/src/graph.rs b/src/graph.rs index 29bbc07..492d5e1 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -9,6 +9,7 @@ use std::{ use enum_dispatch::enum_dispatch; use petgraph::stable_graph::NodeIndex; +use serde::{Deserialize, Serialize}; pub trait MakeRef<'a, R: 'a, C> { fn ref_(&self, context: &'a C) -> R; @@ -19,9 +20,14 @@ pub trait GetPetgraphIndex { fn petgraph_index(&self) -> NodeIndex; } -#[derive(Debug, Clone, Copy)] +// unfortunately, as we don't want any restrictions on `W`, +// we have to implement many traits ourselves, instead of using derive macros. +#[derive(Deserialize, Serialize)] +#[serde(bound = "")] +#[serde(transparent)] pub struct GenericIndex { node_index: NodeIndex, + #[serde(skip)] marker: PhantomData, } @@ -34,22 +40,59 @@ impl GenericIndex { } } +impl core::clone::Clone for GenericIndex { + #[inline] + fn clone(&self) -> Self { + Self { + node_index: self.node_index, + marker: PhantomData, + } + } +} + +impl core::fmt::Debug for GenericIndex { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_tuple("GenericIndex") + .field(&self.node_index.index()) + .finish() + } +} + +impl PartialEq for GenericIndex { + #[inline] + fn eq(&self, oth: &Self) -> bool { + self.node_index == oth.node_index + } +} + +impl core::marker::Copy for GenericIndex {} +impl Eq for GenericIndex {} + impl Hash for GenericIndex { fn hash(&self, state: &mut H) { self.node_index.hash(state) } } -impl PartialEq for GenericIndex { - fn eq(&self, other: &Self) -> bool { - self.node_index == other.node_index - } -} - -impl Eq for GenericIndex {} - impl GetPetgraphIndex for GenericIndex { fn petgraph_index(&self) -> NodeIndex { self.node_index } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn serializable_index() { + assert_eq!( + serde_json::to_string(&GenericIndex::<()>::new(NodeIndex::new(0))).unwrap(), + "0" + ); + assert_eq!( + serde_json::from_str::>("0").unwrap(), + GenericIndex::new(NodeIndex::new(0)) + ); + } +}