graaf/op/sources.rs
1//! Iterate a digraph's sources.
2//!
3//! A source is a vertex without in-neighbors.
4//!
5//! # Examples
6//!
7//! ```
8//! use graaf::{
9//! AddArc,
10//! AdjacencyList,
11//! Empty,
12//! Sources,
13//! };
14//!
15//! let mut digraph = AdjacencyList::empty(4);
16//!
17//! digraph.add_arc(0, 1);
18//! digraph.add_arc(0, 2);
19//! digraph.add_arc(1, 2);
20//!
21//! assert!(digraph.sources().eq([0, 3]));
22//! ```
23
24/// Digraph sources
25pub trait Sources {
26 /// Iterate the sources in the digraph.
27 ///
28 /// # Examples
29 ///
30 /// ```
31 /// use graaf::{
32 /// AddArc,
33 /// AdjacencyList,
34 /// Empty,
35 /// Sources,
36 /// };
37 ///
38 /// let mut digraph = AdjacencyList::empty(4);
39 ///
40 /// digraph.add_arc(0, 1);
41 /// digraph.add_arc(0, 2);
42 /// digraph.add_arc(1, 2);
43 ///
44 /// assert!(digraph.sources().eq([0, 3]));
45 /// ```
46 #[must_use]
47 fn sources(&self) -> impl Iterator<Item = usize>;
48}
49
50/// `Sources` tests
51#[macro_export]
52macro_rules! test_sources {
53 ($fixture:path) => {
54 use $fixture::{
55 bang_jensen_34,
56 bang_jensen_94,
57 bang_jensen_196,
58 kattis_builddeps,
59 kattis_cantinaofbabel_1,
60 kattis_cantinaofbabel_2,
61 kattis_escapewallmaria_1,
62 kattis_escapewallmaria_2,
63 kattis_escapewallmaria_3,
64 };
65
66 #[test]
67 fn sources_bang_jensen_196() {
68 assert!(bang_jensen_196().sources().eq([]));
69 }
70
71 #[test]
72 fn sources_bang_jensen_34() {
73 assert!(bang_jensen_34().sources().eq([2]));
74 }
75
76 #[test]
77 fn sources_bang_jensen_94() {
78 assert!(bang_jensen_94().sources().eq([0]));
79 }
80
81 #[test]
82 fn sources_kattis_builddeps() {
83 assert!(kattis_builddeps().sources().eq([0, 2]));
84 }
85
86 #[test]
87 fn sources_kattis_cantinaofbabel_1() {
88 assert!(kattis_cantinaofbabel_1().sources().eq([8]));
89 }
90
91 #[test]
92 fn sources_kattis_cantinaofbabel_2() {
93 assert!(kattis_cantinaofbabel_2().sources().eq([]));
94 }
95
96 #[test]
97 fn sources_kattis_escapewallmaria_1() {
98 assert!(
99 kattis_escapewallmaria_1()
100 .sources()
101 .eq([0, 1, 2, 3, 4, 7, 8, 10, 11, 14, 15])
102 );
103 }
104
105 #[test]
106 fn sources_kattis_escapewallmaria_2() {
107 assert!(
108 kattis_escapewallmaria_2()
109 .sources()
110 .eq([0, 1, 2, 3, 4, 7, 8, 10, 11, 14, 15])
111 );
112 }
113
114 #[test]
115 fn sources_kattis_escapewallmaria_3() {
116 assert!(
117 kattis_escapewallmaria_3()
118 .sources()
119 .eq([0, 3, 4, 7, 8, 10, 11, 14, 15])
120 );
121 }
122 };
123}