annotate lib/bitset.c @ 40057:b06060465f09

maint: Run 'make update-copyright'
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 01 Jan 2019 00:25:11 +0100
parents 14ac09965b35
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
1 /* General bitsets.
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
2
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 39981
diff changeset
3 Copyright (C) 2002-2006, 2009-2015, 2018-2019 Free Software Foundation, Inc.
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
4
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
5 Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
6
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
7 This program is free software: you can redistribute it and/or modify
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
9 the Free Software Foundation, either version 3 of the License, or
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
10 (at your option) any later version.
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
11
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
12 This program is distributed in the hope that it will be useful,
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
15 GNU General Public License for more details.
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
16
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
19
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
20 #include <config.h>
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
21
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
22 #include "bitset.h"
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
23
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
24 #include <stdlib.h>
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
25 #include <string.h>
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
26
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
27 #include "obstack.h"
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
28
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
29 #include "bitset/array.h"
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
30 #include "bitset/list.h"
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
31 #include "bitset/stats.h"
39981
14ac09965b35 bitset: rename ebitset/expandable.* as tbitset/table.*
Akim Demaille <akim.demaille@gmail.com>
parents: 39978
diff changeset
32 #include "bitset/table.h"
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
33 #include "bitset/vector.h"
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
34
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
35 const char * const bitset_type_names[] = BITSET_TYPE_NAMES;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
36
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
37
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
38 /* Return number of bytes required to create a N_BIT bitset
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
39 of TYPE. The bitset may grow to require more bytes than this. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
40 size_t
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
41 bitset_bytes (enum bitset_type type, bitset_bindex n_bits)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
42 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
43 if (bitset_stats_enabled)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
44 return bitset_stats_bytes ();
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
45
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
46 switch (type)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
47 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
48 default:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
49 abort ();
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
50
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
51 case BITSET_ARRAY:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
52 return abitset_bytes (n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
53
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
54 case BITSET_LIST:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
55 return lbitset_bytes (n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
56
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
57 case BITSET_TABLE:
39981
14ac09965b35 bitset: rename ebitset/expandable.* as tbitset/table.*
Akim Demaille <akim.demaille@gmail.com>
parents: 39978
diff changeset
58 return tbitset_bytes (n_bits);
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
59
39978
9d336a02bad8 bitset: rename BITSET_VARRAY as BITSET_VECTOR
Akim Demaille <akim.demaille@gmail.com>
parents: 39973
diff changeset
60 case BITSET_VECTOR:
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
61 return vbitset_bytes (n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
62 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
63 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
64
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
65
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
66 /* Initialise bitset BSET of TYPE for N_BITS. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
67 bitset
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
68 bitset_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
69 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
70 if (bitset_stats_enabled)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
71 return bitset_stats_init (bset, n_bits, type);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
72
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
73 switch (type)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
74 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
75 default:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
76 abort ();
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
77
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
78 case BITSET_ARRAY:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
79 return abitset_init (bset, n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
80
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
81 case BITSET_LIST:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
82 return lbitset_init (bset, n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
83
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
84 case BITSET_TABLE:
39981
14ac09965b35 bitset: rename ebitset/expandable.* as tbitset/table.*
Akim Demaille <akim.demaille@gmail.com>
parents: 39978
diff changeset
85 return tbitset_init (bset, n_bits);
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
86
39978
9d336a02bad8 bitset: rename BITSET_VARRAY as BITSET_VECTOR
Akim Demaille <akim.demaille@gmail.com>
parents: 39973
diff changeset
87 case BITSET_VECTOR:
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
88 return vbitset_init (bset, n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
89 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
90 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
91
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
92
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
93 /* Select a bitset type for a set of N_BITS and with attribute hints
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
94 specified by ATTR. For variable size bitsets, N_BITS is only a
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
95 hint and may be zero. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
96 enum bitset_type
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
97 bitset_type_choose (bitset_bindex n_bits ATTRIBUTE_UNUSED, unsigned attr)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
98 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
99 /* Check attributes. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
100 if (attr & BITSET_FIXED && attr & BITSET_VARIABLE)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
101 abort ();
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
102 if (attr & BITSET_SPARSE && attr & BITSET_DENSE)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
103 abort ();
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
104
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
105 /* Choose the type of bitset. Note that sometimes we will be asked
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
106 for a zero length fixed size bitset. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
107
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
108
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
109 /* If no attributes selected, choose a good compromise. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
110 if (!attr)
39978
9d336a02bad8 bitset: rename BITSET_VARRAY as BITSET_VECTOR
Akim Demaille <akim.demaille@gmail.com>
parents: 39973
diff changeset
111 return BITSET_VECTOR;
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
112
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
113 if (attr & BITSET_SPARSE)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
114 return BITSET_LIST;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
115
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
116 if (attr & BITSET_FIXED)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
117 return BITSET_ARRAY;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
118
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
119 if (attr & BITSET_GREEDY)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
120 return BITSET_TABLE;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
121
39978
9d336a02bad8 bitset: rename BITSET_VARRAY as BITSET_VECTOR
Akim Demaille <akim.demaille@gmail.com>
parents: 39973
diff changeset
122 return BITSET_VECTOR;
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
123 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
124
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
125
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
126 /* Create a bitset of N_BITS of type TYPE. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
127 bitset
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
128 bitset_alloc (bitset_bindex n_bits, enum bitset_type type)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
129 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
130 size_t bytes = bitset_bytes (type, n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
131
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
132 bitset bset = xcalloc (1, bytes);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
133
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
134 /* The cache is disabled until some elements are allocated. If we
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
135 have variable length arrays, then we may need to allocate a dummy
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
136 element. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
137
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
138 return bitset_init (bset, n_bits, type);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
139 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
140
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
141
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
142 /* Create a bitset of N_BITS of type TYPE. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
143 bitset
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
144 bitset_obstack_alloc (struct obstack *bobstack,
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
145 bitset_bindex n_bits, enum bitset_type type)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
146 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
147 size_t bytes = bitset_bytes (type, n_bits);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
148
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
149 bitset bset = obstack_alloc (bobstack, bytes);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
150 memset (bset, 0, bytes);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
151
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
152 return bitset_init (bset, n_bits, type);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
153 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
154
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
155
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
156 /* Create a bitset of N_BITS and with attribute hints specified by
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
157 ATTR. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
158 bitset
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
159 bitset_create (bitset_bindex n_bits, unsigned attr)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
160 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
161 enum bitset_type type = bitset_type_choose (n_bits, attr);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
162
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
163 return bitset_alloc (n_bits, type);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
164 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
165
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
166
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
167 /* Free bitset BSET. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
168 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
169 bitset_free (bitset bset)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
170 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
171 BITSET_FREE_ (bset);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
172 free (bset);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
173 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
174
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
175
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
176 /* Free bitset BSET allocated on obstack. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
177 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
178 bitset_obstack_free (bitset bset)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
179 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
180 BITSET_FREE_ (bset);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
181 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
182
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
183
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
184 /* Return bitset type. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
185 enum bitset_type
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
186 bitset_type_get (bitset bset)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
187 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
188 enum bitset_type type = BITSET_TYPE_ (bset);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
189 if (type != BITSET_STATS)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
190 return type;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
191
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
192 return bitset_stats_type_get (bset);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
193 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
194
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
195
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
196 /* Return name of bitset type. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
197 const char *
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
198 bitset_type_name_get (bitset bset)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
199 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
200 enum bitset_type type = bitset_type_get (bset);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
201
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
202 return bitset_type_names[type];
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
203 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
204
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
205
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
206 /* Find next bit set in SRC starting from and including BITNO.
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
207 Return BITSET_BINDEX_MAX if SRC empty. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
208 bitset_bindex
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
209 bitset_next (bitset src, bitset_bindex bitno)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
210 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
211 bitset_bindex next = bitno;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
212 bitset_bindex val;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
213 if (!bitset_list (src, &val, 1, &next))
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
214 return BITSET_BINDEX_MAX;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
215 return val;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
216 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
217
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
218
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
219 /* Return true if both bitsets are of the same type and size. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
220 extern bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
221 bitset_compatible_p (bitset bset1, bitset bset2)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
222 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
223 return BITSET_COMPATIBLE_ (bset1, bset2);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
224 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
225
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
226
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
227 /* Find previous bit set in SRC starting from and including BITNO.
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
228 Return BITSET_BINDEX_MAX if SRC empty. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
229 bitset_bindex
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
230 bitset_prev (bitset src, bitset_bindex bitno)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
231 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
232 bitset_bindex next = bitno;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
233 bitset_bindex val;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
234 if (!bitset_list_reverse (src, &val, 1, &next))
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
235 return BITSET_BINDEX_MAX;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
236 return val;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
237 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
238
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
239
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
240 /* Find first set bit. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
241 bitset_bindex
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
242 bitset_first (bitset src)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
243 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
244 return bitset_next (src, 0);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
245 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
246
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
247
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
248 /* Find last set bit. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
249 bitset_bindex
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
250 bitset_last (bitset src)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
251 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
252 return bitset_prev (src, 0);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
253 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
254
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
255
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
256 /* Is BITNO in SRC the only set bit? */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
257 bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
258 bitset_only_set_p (bitset src, bitset_bindex bitno)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
259 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
260 bitset_bindex val[2];
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
261 bitset_bindex next = 0;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
262
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
263 if (bitset_list (src, val, 2, &next) != 1)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
264 return false;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
265 return val[0] == bitno;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
266 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
267
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
268
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
269 /* Print contents of bitset BSET to FILE. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
270 static void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
271 bitset_print (FILE *file, bitset bset, bool verbose)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
272 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
273 if (verbose)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
274 fprintf (file, "n_bits = %lu, set = {",
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
275 (unsigned long) bitset_size (bset));
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
276
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
277 unsigned pos = 30;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
278 bitset_bindex i;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
279 bitset_iterator iter;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
280 BITSET_FOR_EACH (iter, bset, i, 0)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
281 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
282 if (pos > 70)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
283 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
284 fprintf (file, "\n");
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
285 pos = 0;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
286 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
287
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
288 fprintf (file, "%lu ", (unsigned long) i);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
289 pos += 1 + (i >= 10) + (i >= 100);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
290 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
291
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
292 if (verbose)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
293 fprintf (file, "}\n");
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
294 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
295
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
296
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
297 /* Dump bitset BSET to FILE. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
298 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
299 bitset_dump (FILE *file, bitset bset)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
300 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
301 bitset_print (file, bset, false);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
302 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
303
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
304
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
305 /* Release memory associated with bitsets. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
306 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
307 bitset_release_memory (void)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
308 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
309 lbitset_release_memory ();
39981
14ac09965b35 bitset: rename ebitset/expandable.* as tbitset/table.*
Akim Demaille <akim.demaille@gmail.com>
parents: 39978
diff changeset
310 tbitset_release_memory ();
39973
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
311 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
312
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
313
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
314 /* Toggle bit BITNO in bitset BSET and the new value of the bit. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
315 bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
316 bitset_toggle_ (bitset bset, bitset_bindex bitno)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
317 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
318 /* This routine is for completeness. It could be optimized if
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
319 required. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
320 if (bitset_test (bset, bitno))
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
321 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
322 bitset_reset (bset, bitno);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
323 return false;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
324 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
325 else
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
326 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
327 bitset_set (bset, bitno);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
328 return true;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
329 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
330 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
331
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
332
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
333 /* Return number of bits in bitset SRC. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
334 bitset_bindex
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
335 bitset_size_ (bitset src)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
336 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
337 return BITSET_NBITS_ (src);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
338 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
339
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
340
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
341 /* Return number of bits set in bitset SRC. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
342 bitset_bindex
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
343 bitset_count_ (bitset src)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
344 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
345 bitset_bindex list[BITSET_LIST_SIZE];
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
346 bitset_bindex count = 0;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
347
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
348 /* This could be greatly sped up by adding a count method for each
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
349 bitset implementation that uses a direct technique (based on
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
350 masks) for counting the number of bits set in a word. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
351
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
352 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
353 bitset_bindex next = 0;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
354 bitset_bindex num;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
355 while ((num = bitset_list (src, list, BITSET_LIST_SIZE, &next)))
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
356 count += num;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
357 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
358
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
359 return count;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
360 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
361
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
362
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
363 /* DST = SRC. Return true if DST != SRC.
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
364 This is a fallback for the case where SRC and DST are different
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
365 bitset types. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
366 bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
367 bitset_copy_ (bitset dst, bitset src)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
368 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
369 bitset_bindex i;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
370 bitset_iterator iter;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
371
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
372 /* Convert bitset types. We assume that the DST bitset
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
373 is large enough to hold the SRC bitset. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
374 bitset_zero (dst);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
375 BITSET_FOR_EACH (iter, src, i, 0)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
376 bitset_set (dst, i);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
377
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
378 return true;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
379 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
380
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
381
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
382 /* This is a fallback for implementations that do not support
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
383 four operand operations. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
384 static inline bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
385 bitset_op4_cmp (bitset dst, bitset src1, bitset src2, bitset src3,
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
386 enum bitset_ops op)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
387 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
388 bool changed = false;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
389
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
390 /* Create temporary bitset. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
391 bool stats_enabled_save = bitset_stats_enabled;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
392 bitset_stats_enabled = false;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
393 bitset tmp = bitset_alloc (0, bitset_type_get (dst));
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
394 bitset_stats_enabled = stats_enabled_save;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
395
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
396 switch (op)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
397 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
398 default:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
399 abort ();
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
400
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
401 case BITSET_OP_OR_AND:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
402 bitset_or (tmp, src1, src2);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
403 changed = bitset_and_cmp (dst, src3, tmp);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
404 break;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
405
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
406 case BITSET_OP_AND_OR:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
407 bitset_and (tmp, src1, src2);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
408 changed = bitset_or_cmp (dst, src3, tmp);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
409 break;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
410
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
411 case BITSET_OP_ANDN_OR:
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
412 bitset_andn (tmp, src1, src2);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
413 changed = bitset_or_cmp (dst, src3, tmp);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
414 break;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
415 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
416
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
417 bitset_free (tmp);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
418 return changed;
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
419 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
420
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
421
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
422 /* DST = (SRC1 & SRC2) | SRC3. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
423 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
424 bitset_and_or_ (bitset dst, bitset src1, bitset src2, bitset src3)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
425 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
426 bitset_and_or_cmp_ (dst, src1, src2, src3);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
427 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
428
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
429
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
430 /* DST = (SRC1 & SRC2) | SRC3. Return non-zero if
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
431 DST != (SRC1 & SRC2) | SRC3. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
432 bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
433 bitset_and_or_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
434 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
435 return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_AND_OR);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
436 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
437
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
438
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
439 /* DST = (SRC1 & ~SRC2) | SRC3. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
440 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
441 bitset_andn_or_ (bitset dst, bitset src1, bitset src2, bitset src3)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
442 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
443 bitset_andn_or_cmp_ (dst, src1, src2, src3);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
444 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
445
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
446
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
447 /* DST = (SRC1 & ~SRC2) | SRC3. Return non-zero if
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
448 DST != (SRC1 & ~SRC2) | SRC3. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
449 bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
450 bitset_andn_or_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
451 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
452 return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_ANDN_OR);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
453 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
454
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
455
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
456 /* DST = (SRC1 | SRC2) & SRC3. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
457 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
458 bitset_or_and_ (bitset dst, bitset src1, bitset src2, bitset src3)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
459 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
460 bitset_or_and_cmp_ (dst, src1, src2, src3);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
461 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
462
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
463
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
464 /* DST = (SRC1 | SRC2) & SRC3. Return non-zero if
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
465 DST != (SRC1 | SRC2) & SRC3. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
466 bool
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
467 bitset_or_and_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
468 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
469 return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_OR_AND);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
470 }
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
471
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
472
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
473 /* Function to be called from debugger to print bitset. */
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
474 void
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
475 debug_bitset (bitset bset)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
476 {
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
477 if (bset)
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
478 bitset_print (stderr, bset, true);
12c0d1c1c28a bitset: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
479 }