visitor/
visitor.rs

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}