1extern crate sorting_networks;
2
3use sorting_networks::generate::*;
4
5trait Visitor<T> {
6 type Payload;
7
8 fn visit(&self, visitee: T, payload: Self::Payload);
9}
10
11struct NetworkVisitor;
12
13impl Visitor<Network> for NetworkVisitor {
14 type Payload = ();
15
16 fn visit(&self, network: Network, _payload: ()) {
17 println!("network {:?}", 1 << network.order());
18 let groups = network.groups();
19 for (index, group) in network.enumerate() {
20 self.visit(group, Cursor::new(index, groups));
21 }
22 }
23}
24
25impl Visitor<Group> for NetworkVisitor {
26 type Payload = Cursor;
27
28 fn visit(&self, group: Group, cursor: Cursor) {
29 println!("→ group {:?}/{:?}", cursor.index, cursor.count);
30 let blocks = group.blocks();
31 for (index, block) in group.enumerate() {
32 self.visit(block, Cursor::new(index, blocks));
33 }
34 }
35}
36
37impl Visitor<Block> for NetworkVisitor {
38 type Payload = Cursor;
39
40 fn visit(&self, block: Block, cursor: Cursor) {
41 println!(" → block {:?}/{:?}", cursor.index, cursor.count);
42 let stages = block.stages();
43 for (index, stage) in block.enumerate() {
44 self.visit(stage, Cursor::new(index, stages));
45 }
46 }
47}
48
49impl Visitor<Stage> for NetworkVisitor {
50 type Payload = Cursor;
51
52 fn visit(&self, stage: Stage, cursor: Cursor) {
53 println!(" → stage {:?}/{:?}", cursor.index, cursor.count);
54 let patterns = stage.patterns();
55 for (index, pattern) in stage.enumerate() {
56 self.visit(pattern, Cursor::new(index, patterns));
57 }
58 }
59}
60
61impl Visitor<Pattern> for NetworkVisitor {
62 type Payload = Cursor;
63
64 fn visit(&self, pattern: Pattern, cursor: Cursor) {
65 println!(" → pattern {:?}/{:?}", cursor.index, cursor.count);
66 let pairs = pattern.pairs();
67 for (index, pair) in pattern.enumerate() {
68 self.visit(pair, Cursor::new(index, pairs));
69 }
70 }
71}
72
73impl Visitor<Pair> for NetworkVisitor {
74 type Payload = Cursor;
75
76 fn visit(&self, pair: Pair, cursor: Cursor) {
77 println!(
78 " → pair {:?}/{:?}: {:?}-{:?}",
79 cursor.index, cursor.count, pair.min, pair.max
80 );
81 }
82}
83
84fn main() {
85 let order = 4;
86 let network = Network::new(order);
87 let visitor = NetworkVisitor;
88
89 visitor.visit(network, ());
90}