1/* Binary relations.
2
3 Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software
4 Foundation, Inc.
5
6 This file is part of Bison, the GNU Compiler Compiler.
7
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21
22#ifndef RELATION_H_
23# define RELATION_H_
24
25/* Performing operations on graphs coded as list of adjacency.
26
27 If GRAPH is a relation, then GRAPH[Node] is a list of adjacent
28 nodes, ended with END_NODE. */
29
30# define END_NODE ((relation_node) -1)
31
32typedef size_t relation_node;
33typedef relation_node *relation_nodes;
34typedef relation_nodes *relation;
35
36typedef void (relation_node_print) (relation_node node, FILE* out);
37
38/* Report a relation R that has SIZE vertices. */
39void relation_print (const char *title,
40 relation r, size_t size,
41 relation_node_print print, FILE *out);
42
43/* Compute the transitive closure of the FUNCTION on the relation R
44 with SIZE vertices.
45
46 If R (NODE1, NODE2) then on exit FUNCTION[NODE1] was extended
47 (unioned) with FUNCTION[NODE2].
48
49 FUNCTION is in-out, R is read only. */
50void relation_digraph (const relation r, relation_node size, bitsetv function);
51
52/* Destructively transpose *R_ARG, of size SIZE. */
53void relation_transpose (relation *R_arg, relation_node size);
54
55#endif /* ! RELATION_H_ */
56