]> git.ozlabs.org Git - ccan/blob - ccan/aga/test/traversal1.c
tal: handle take() pointers more carefully.
[ccan] / ccan / aga / test / traversal1.c
1 #include "config.h"
2
3 #include <assert.h>
4
5 #include <ccan/container_of/container_of.h>
6 #include <ccan/ptrint/ptrint.h>
7
8 #include <ccan/aga/aga.h>
9
10 #include "simple-graph.h"
11
12 static ptrint_t *traversal1_first_edge(const struct aga_graph *g,
13                                        const struct aga_node *n)
14 {
15         struct traversal1_graph *t1g = container_of(g, struct traversal1_graph,
16                                                     sg.g);
17         int ni = n - t1g->sg.nodes;
18
19         switch (ni) {
20         case 1:
21         case 2:
22         case 3:
23
24         case 7:
25         case 8:
26         case 9:
27                 return int2ptr(1);
28
29         case 4:
30         case 5:
31         case 6:
32                 return NULL;
33
34         default:
35                 assert(0);
36         }
37 }
38
39 static ptrint_t *traversal1_next_edge(const struct aga_graph *g,
40                                       const struct aga_node *n,
41                                       ptrint_t *e)
42 {
43         struct traversal1_graph *t1g = container_of(g, struct traversal1_graph,
44                                                     sg.g);
45         int ni = n - t1g->sg.nodes;
46         int index = ptr2int(e);
47
48         assert((ni < 4) || (ni > 6));
49         if (index == 1)
50                 return int2ptr(2);
51         else if (index == 2)
52                 return NULL;
53         else
54                 assert(0);
55 }
56
57 static int traversal1_edge_info(const struct aga_graph *g,
58                                 const struct aga_node *n,
59                                 ptrint_t *e, struct aga_edge_info *ei)
60 {
61         struct traversal1_graph *t1g = container_of(g, struct traversal1_graph,
62                                                     sg.g);
63         int ni = n - t1g->sg.nodes;
64         int index = ptr2int(e);
65
66         assert((index == 1) || (index == 2));
67
68         switch (ni) {
69         case 1:
70                 if (index == 1)
71                         ei->to = &t1g->sg.nodes[2];
72                 else
73                         ei->to = &t1g->sg.nodes[3];
74                 break;
75
76         case 2:
77                 if (index == 1)
78                         ei->to = &t1g->sg.nodes[4];
79                 else
80                         ei->to = &t1g->sg.nodes[5];
81                 break;
82         case 3:
83                 if (index == 1)
84                         ei->to = &t1g->sg.nodes[5];
85                 else
86                         ei->to = &t1g->sg.nodes[6];
87                 break;
88
89         case 7:
90                 if (index == 1)
91                         ei->to = &t1g->sg.nodes[5];
92                 else
93                         ei->to = &t1g->sg.nodes[4];
94                 break;
95
96         case 8:
97                 if (index == 1)
98                         ei->to = &t1g->sg.nodes[6];
99                 else
100                         ei->to = &t1g->sg.nodes[5];
101                 break;
102
103         case 9:
104                 if (index == 1)
105                         ei->to = &t1g->sg.nodes[8];
106                 else
107                         ei->to = &t1g->sg.nodes[7];
108                 break;
109
110         default:
111                 assert(0);
112         }
113         return 0;
114 }
115
116 void traversal1_graph_init(struct traversal1_graph *t1g)
117 {
118         simple_graph_init(&t1g->sg, traversal1_first_edge,
119                           traversal1_next_edge,
120                           traversal1_edge_info);
121 }