]> git.ozlabs.org Git - ccan/blob - ccan/aga/aga.c
aga,agar: Rename aga_dijkstra_all_paths()
[ccan] / ccan / aga / aga.c
1 /* Licensed under LGPLv2+ - see LICENSE file for details */
2 #include "config.h"
3
4 #include <stdbool.h>
5 #include <stdlib.h>
6 #include <assert.h>
7
8 #include <ccan/aga/aga.h>
9
10 #include "private.h"
11
12 void aga_init_graph_(struct aga_graph *g,
13                      aga_first_edge_fn first_edge,
14                      aga_next_edge_fn next_edge,
15                      aga_edge_info_fn edge_info)
16 {
17         g->sequence = 0;
18         g->error = AGA_ERR_NONE;
19
20         g->first_edge = first_edge;
21         g->next_edge = next_edge;
22         g->edge_info = edge_info;
23 }
24
25 int aga_error(const struct aga_graph *g)
26 {
27         return g->error;
28 }
29
30 void aga_fail(struct aga_graph *g, int error)
31 {
32         g->error = error;
33 }
34
35 int aga_start(struct aga_graph *g)
36 {
37         if (g->sequence & 1) /* Odd means someone's already running */
38                 return -1;
39         assert(g->error == 0);
40         /* FIXME: Want an atomic cmpxchg to make this thread safe */
41         ++g->sequence;
42         return 0;
43 }
44
45 bool aga_check_state(const struct aga_graph *g)
46 {
47         if (!(g->sequence & 1))
48                 return false; /* No algo in progress */
49         if (g->error)
50                 return false; /* error state */
51         return true;
52 }
53
54 void aga_finish(struct aga_graph *g)
55 {
56         assert(g->sequence & 1);
57         g->error = AGA_ERR_NONE;
58         g->sequence++;
59 }
60
61 bool aga_node_needs_update(const struct aga_graph *g,
62                            const struct aga_node *node)
63 {
64         return (node->sequence != g->sequence);
65 }
66
67 bool aga_update_node(const struct aga_graph *g, struct aga_node *node)
68 {
69         if (!aga_node_needs_update(g, node))
70                 return false;
71
72         node->sequence = g->sequence;
73         return true;
74 }
75
76 const void *aga_first_edge(const struct aga_graph *g, const struct aga_node *n)
77 {
78         return g->first_edge(g, n);
79 }
80
81 const void *aga_next_edge(const struct aga_graph *g, const struct aga_node *n,
82                           const void *e)
83 {
84         if (!e)
85                 return NULL;
86         else
87                 return g->next_edge(g, n, e);
88 }
89
90 int aga_edge_info(const struct aga_graph *g, const struct aga_node *n,
91                   const void *e, struct aga_edge_info *ei)
92 {
93         int rc;
94
95         ei->to = NULL;
96         ei->icost = 1;
97         rc = g->edge_info(g, n, e, ei);
98         assert(rc <= 0);
99         return rc;
100 }