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