1 /* A simple, memory-efficient bitset implementation.
2 
3    Copyright (C) 2009-2012 Free Software Foundation, Inc.
4 
5    This file is part of Bison, the GNU Compiler Compiler.
6 
7    This program is free software: you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation, either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include <config.h>
21 #include "system.h"
22 
23 #include "Sbitset.h"
24 
25 Sbitset
Sbitset__new(Sbitset__Index nbits)26 Sbitset__new (Sbitset__Index nbits)
27 {
28   /* Some functions, like Sbitset__last_byte_mask, will fail if nbits = 0.  */
29   aver (nbits);
30   return xcalloc (1, Sbitset__nbytes (nbits));
31 }
32 
33 Sbitset
Sbitset__new_on_obstack(Sbitset__Index nbits,struct obstack * obstackp)34 Sbitset__new_on_obstack (Sbitset__Index nbits, struct obstack *obstackp)
35 {
36   Sbitset result;
37   Sbitset ptr;
38   Sbitset end;
39   aver (nbits);
40   result = obstack_alloc (obstackp, Sbitset__nbytes (nbits));
41   for (ptr = result, end = result + Sbitset__nbytes (nbits); ptr < end; ++ptr)
42     *ptr = 0;
43   return result;
44 }
45 
46 void
Sbitset__delete(Sbitset self)47 Sbitset__delete (Sbitset self)
48 {
49   free (self);
50 }
51 
52 bool
Sbitset__isEmpty(Sbitset self,Sbitset__Index nbits)53 Sbitset__isEmpty (Sbitset self, Sbitset__Index nbits)
54 {
55   Sbitset last = self + Sbitset__nbytes (nbits) - 1;
56   for (; self < last; ++self)
57     if (*self != 0)
58       return false;
59   return ((*last) & Sbitset__last_byte_mask (nbits)) == 0;
60 }
61 
62 void
Sbitset__fprint(Sbitset self,Sbitset__Index nbits,FILE * file)63 Sbitset__fprint(Sbitset self, Sbitset__Index nbits, FILE *file)
64 {
65   Sbitset__Index i;
66   Sbitset itr;
67   bool first = true;
68   fprintf (file,
69            "nbits = %" SBITSET__INDEX__CONVERSION_SPEC ", set = {",
70            nbits);
71   SBITSET__FOR_EACH (self, nbits, itr, i)
72     {
73       if (first)
74         first = false;
75       else
76         fprintf (file, ",");
77       fprintf (file, " %" SBITSET__INDEX__CONVERSION_SPEC, i);
78     }
79   fprintf (file, " }");
80 }
81