1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//! Contains the traits used to represent a doubly connected edge list

/// Trait to mark a dart type
pub trait Dart {}

/// Trait to mark a face
pub trait Face {}

/// Trait to mark a vertex
pub trait Vertex {}

/// Trait to be implemented by every vertex implementation
pub trait GraphDCEL<
    V: Vertex,
    D: Dart,
    F: Face,
    VI: Iterator<Item = V>,
    DI: Iterator<Item = D>,
    FI: Iterator<Item = F>,
>
{
    /// Returns all vertex in the graph as an iterator
    fn get_vertexes(&self) -> VI;
    /// Returns all darts in the graph as an iterator
    fn get_darts(&self) -> DI;
    /// Returns all faces in the graph as an iterator
    fn get_faces(&self) -> FI;
    /// Returns the number of vertexes in the graph
    fn vertex_count(&self) -> usize;
    /// Returns the number of darts in the graph
    fn dart_count(&self) -> usize;
    /// Returns the number of edges in the graph
    fn edge_count(&self) -> usize;
    /// Returns the number of faces in the graph
    fn face_count(&self) -> usize;
    /// Returns the number of vertexes adjacent to the given face
    fn face_vertex_count(&self, face: &F) -> usize;
    /// Returns the amount of vertex neighboring the given vertex
    fn neighbors_count(&self, vertex: &V) -> usize;
    /// Returns a vector of neighbors of the given vertex
    fn neighbors(&self, vertex: &V) -> Vec<V>;
    /// Returns a vertex specified by this id
    fn vertex_by_id(&self, id: usize) -> Option<V>;

    /// Returns the dart between to vertexes
    fn get_dart(&self, vertex: &V, target: &V) -> Option<D>;
    /// Returns the dart linked to the given vertex
    fn dart_vertex(&self, vertex: &V) -> D;
    /// Returns the the dart linked to the given face
    fn dart_face(&self, face: &F) -> D;
    /// Returns the twin dart of the given dart
    fn twin(&self, dart: &D) -> D;
    /// Returns the target vertex of the given dart
    fn dart_target(&self, dart: &D) -> V;
    /// Return the face adjacent to the given dart
    fn face(&self, dart: &D) -> F;
    /// Returns the next dart in the dart order
    fn next(&self, current: &D) -> D;
    /// Returns the previous dart in the dart order
    fn prev(&self, current: &D) -> D;

    /// Adds a new vertex
    fn add_vertex(&mut self) -> V;
    /// Adds a new dart
    fn add_dart(
        &mut self,
        from: V,
        to: V,
        prev: Option<D>,
        next: Option<D>,
        twin: Option<D>,
        face: Option<F>,
    ) -> D;
    /// Adds a new face
    fn add_face(&mut self, dart: D) -> F;

    /// Sets the face for the given Dart
    fn set_face(&self, dart: &D, face: F);
}