partition.h revision 1.1.1.6 1 1.1 christos /* List implementation of a partition of consecutive integers.
2 1.1.1.6 christos Copyright (C) 2000-2019 Free Software Foundation, Inc.
3 1.1 christos Contributed by CodeSourcery, LLC.
4 1.1 christos
5 1.1 christos This file is part of GCC.
6 1.1 christos
7 1.1 christos GCC is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 2, or (at your option)
10 1.1 christos any later version.
11 1.1 christos
12 1.1 christos GCC is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with GCC; see the file COPYING. If not, write to
19 1.1 christos the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 1.1 christos Boston, MA 02110-1301, USA. */
21 1.1 christos
22 1.1 christos /* This package implements a partition of consecutive integers. The
23 1.1 christos elements are partitioned into classes. Each class is represented
24 1.1 christos by one of its elements, the canonical element, which is chosen
25 1.1 christos arbitrarily from elements in the class. The principal operations
26 1.1 christos on a partition are FIND, which takes an element, determines its
27 1.1 christos class, and returns the canonical element for that class, and UNION,
28 1.1 christos which unites the two classes that contain two given elements into a
29 1.1 christos single class.
30 1.1 christos
31 1.1 christos The list implementation used here provides constant-time finds. By
32 1.1 christos storing the size of each class with the class's canonical element,
33 1.1 christos it is able to perform unions over all the classes in the partition
34 1.1 christos in O (N log N) time. */
35 1.1 christos
36 1.1 christos #ifndef _PARTITION_H
37 1.1 christos #define _PARTITION_H
38 1.1 christos
39 1.1 christos #ifdef __cplusplus
40 1.1 christos extern "C" {
41 1.1 christos #endif /* __cplusplus */
42 1.1 christos
43 1.1 christos #include "ansidecl.h"
44 1.1 christos #include <stdio.h>
45 1.1 christos
46 1.1 christos struct partition_elem
47 1.1 christos {
48 1.1 christos /* The next element in this class. Elements in each class form a
49 1.1 christos circular list. */
50 1.1 christos struct partition_elem* next;
51 1.1.1.3 christos /* The canonical element that represents the class containing this
52 1.1.1.3 christos element. */
53 1.1.1.3 christos int class_element;
54 1.1 christos /* The number of elements in this class. Valid only if this is the
55 1.1 christos canonical element for its class. */
56 1.1 christos unsigned class_count;
57 1.1 christos };
58 1.1 christos
59 1.1 christos typedef struct partition_def
60 1.1 christos {
61 1.1 christos /* The number of elements in this partition. */
62 1.1 christos int num_elements;
63 1.1 christos /* The elements in the partition. */
64 1.1 christos struct partition_elem elements[1];
65 1.1 christos } *partition;
66 1.1 christos
67 1.1 christos extern partition partition_new (int);
68 1.1 christos extern void partition_delete (partition);
69 1.1 christos extern int partition_union (partition, int, int);
70 1.1 christos extern void partition_print (partition, FILE*);
71 1.1 christos
72 1.1 christos /* Returns the canonical element corresponding to the class containing
73 1.1 christos ELEMENT__ in PARTITION__. */
74 1.1 christos
75 1.1 christos #define partition_find(partition__, element__) \
76 1.1 christos ((partition__)->elements[(element__)].class_element)
77 1.1 christos
78 1.1 christos #ifdef __cplusplus
79 1.1 christos }
80 1.1 christos #endif /* __cplusplus */
81 1.1 christos
82 1.1 christos #endif /* _PARTITION_H */
83