1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Bitset statistics.
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
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This file is a wrapper bitset implementation for the other bitset
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   implementations.  It provides bitset compatibility checking and
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   statistics gathering without having to instrument the bitset
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   implementations.  When statistics gathering is enabled, the bitset
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   operations get vectored through here and we then call the appropriate
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   routines.  */
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <config.h>
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "bitset_stats.h"
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "bbitset.h"
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "abitset.h"
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "ebitset.h"
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "lbitset.h"
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "vbitset.h"
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h>
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gettext.h"
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define _(Msgid)  gettext (Msgid)
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Configuration macros.  */
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_FILE "bitset.dat"
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_LOG_COUNT_BINS 10
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_LOG_SIZE_BINS  16
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_DENSITY_BINS  20
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Accessor macros.  */
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_ALLOCS_INC(TYPE)			\
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[(TYPE)].allocs++
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_FREES_INC(BSET)			\
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].frees++
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_SETS_INC(BSET)			\
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].sets++
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_CACHE_SETS_INC(BSET)		\
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_sets++
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_RESETS_INC(BSET)			\
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].resets++
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_CACHE_RESETS_INC(BSET)		\
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_resets++
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_TESTS_INC(BSET)			\
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].tests++
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_CACHE_TESTS_INC(BSET)		\
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_tests++
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_LISTS_INC(BSET)			\
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].lists++
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_LIST_COUNTS_INC(BSET, I)		\
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_counts[(I)]++
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_LIST_SIZES_INC(BSET, I)		\
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_sizes[(I)]++
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define BITSET_STATS_LIST_DENSITY_INC(BSET, I)		\
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_density[(I)]++
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct bitset_type_info_struct
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int allocs;
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int frees;
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int lists;
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int sets;
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int cache_sets;
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int resets;
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int cache_resets;
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int tests;
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int cache_tests;
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int list_counts[BITSET_LOG_COUNT_BINS];
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int list_sizes[BITSET_LOG_SIZE_BINS];
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int list_density[BITSET_DENSITY_BINS];
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct bitset_stats_info_struct
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int runs;
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct bitset_type_info_struct types[BITSET_TYPE_NUM];
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct bitset_stats_info_struct bitset_stats_info_data;
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct bitset_stats_info_struct *bitset_stats_info;
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool bitset_stats_enabled = false;
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print a percentage histogram with message MSG to FILE.  */
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_percent_histogram_print (FILE *file, const char *name, const char *msg,
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				unsigned int n_bins, unsigned int *bins)
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int i;
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int total;
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  total = 0;
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < n_bins; i++)
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    total += bins[i];
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!total)
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, "%s %s", name, msg);
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < n_bins; i++)
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (file, "%.0f-%.0f%%\t%8u (%5.1f%%)\n",
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     i * 100.0 / n_bins,
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     (i + 1) * 100.0 / n_bins, bins[i],
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     (100.0 * bins[i]) / total);
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print a log histogram with message MSG to FILE.  */
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_log_histogram_print (FILE *file, const char *name, const char *msg,
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			    unsigned int n_bins, unsigned int *bins)
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int i;
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int total;
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int max_width;
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  total = 0;
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < n_bins; i++)
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    total += bins[i];
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!total)
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Determine number of useful bins.  */
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = n_bins; i > 3 && ! bins[i - 1]; i--)
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     continue;
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  n_bins = i;
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* 2 * ceil (log10 (2) * (N - 1)) + 1.  */
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  max_width = 2 * (unsigned int) (0.30103 * (n_bins - 1) + 0.9999) + 1;
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, "%s %s", name, msg);
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < 2; i++)
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (file, "%*d\t%8u (%5.1f%%)\n",
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     max_width, i, bins[i], 100.0 * bins[i] / total);
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (; i < n_bins; i++)
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (file, "%*lu-%lu\t%8u (%5.1f%%)\n",
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     max_width - ((unsigned int) (0.30103 * (i) + 0.9999) + 1),
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     1UL << (i - 1),
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     (1UL << i) - 1,
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     bins[i],
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     (100.0 * bins[i]) / total);
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print bitset statistics to FILE.  */
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_print_1 (FILE *file, const char *name,
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		      struct bitset_type_info_struct *stats)
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!stats)
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, "%s:\n", name);
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, _("%u bitset_allocs, %u freed (%.2f%%).\n"),
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->allocs, stats->frees,
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->allocs ? 100.0 * stats->frees / stats->allocs : 0);
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, _("%u bitset_sets, %u cached (%.2f%%)\n"),
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->sets, stats->cache_sets,
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->sets ? 100.0 * stats->cache_sets / stats->sets : 0);
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, _("%u bitset_resets, %u cached (%.2f%%)\n"),
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->resets, stats->cache_resets,
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->resets ? 100.0 * stats->cache_resets / stats->resets : 0);
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, _("%u bitset_tests, %u cached (%.2f%%)\n"),
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->tests, stats->cache_tests,
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   stats->tests ? 100.0 * stats->cache_tests / stats->tests : 0);
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, _("%u bitset_lists\n"), stats->lists);
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_log_histogram_print (file, name, _("count log histogram\n"),
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			      BITSET_LOG_COUNT_BINS, stats->list_counts);
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_log_histogram_print (file, name, _("size log histogram\n"),
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			      BITSET_LOG_SIZE_BINS, stats->list_sizes);
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_percent_histogram_print (file, name, _("density histogram\n"),
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				  BITSET_DENSITY_BINS, stats->list_density);
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print all bitset statistics to FILE.  */
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_print (FILE *file, bool verbose ATTRIBUTE_UNUSED)
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!bitset_stats_info)
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (file, _("Bitset statistics:\n\n"));
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (bitset_stats_info->runs > 1)
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (file, _("Accumulated runs = %u\n"), bitset_stats_info->runs);
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < BITSET_TYPE_NUM; i++)
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_print_1 (file, bitset_type_names[i],
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			  &bitset_stats_info->types[i]);
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Initialise bitset statistics logging.  */
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_enable (void)
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!bitset_stats_info)
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_stats_info = &bitset_stats_info_data;
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_enabled = true;
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_disable (void)
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_enabled = false;
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Read bitset statistics file.  */
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_read (const char *file_name)
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  FILE *file;
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!bitset_stats_info)
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!file_name)
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    file_name = BITSET_STATS_FILE;
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  file = fopen (file_name, "r");
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (file)
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (fread (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 1, file) != 1)
25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (ferror (file))
25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            perror (_("cannot read stats file"));
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          else
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            fprintf (stderr, _("bad stats file size\n"));
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (fclose (file) != 0)
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        perror (_("cannot read stats file"));
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_info_data.runs++;
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Write bitset statistics file.  */
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_write (const char *file_name)
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  FILE *file;
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!bitset_stats_info)
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!file_name)
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    file_name = BITSET_STATS_FILE;
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  file = fopen (file_name, "w");
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (file)
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (fwrite (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  1, file) != 1)
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        perror (_("cannot write stats file"));
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (fclose (file) != 0)
28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        perror (_("cannot write stats file"));
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    perror (_("cannot open stats file for writing"));
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Dump bitset statistics to FILE.  */
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_dump (FILE *file)
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_print (file, false);
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Function to be called from debugger to print bitset stats.  */
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdebug_bitset_stats (void)
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_print (stderr, true);
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_set (bitset dst, bitset_bindex bitno)
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset bset = dst->s.bset;
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_windex wordno = bitno / BITSET_WORD_BITS;
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_windex offset = wordno - bset->b.cindex;
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_SETS_INC (bset);
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (offset < bset->b.csize)
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bset->b.cdata[offset] |= (bitset_word) 1 << (bitno % BITSET_WORD_BITS);
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      BITSET_STATS_CACHE_SETS_INC (bset);
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    BITSET_SET_ (bset, bitno);
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_reset (bitset dst, bitset_bindex bitno)
333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset bset = dst->s.bset;
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_windex wordno = bitno / BITSET_WORD_BITS;
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_windex offset = wordno - bset->b.cindex;
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_RESETS_INC (bset);
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (offset < bset->b.csize)
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bset->b.cdata[offset] &=
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	~((bitset_word) 1 << (bitno % BITSET_WORD_BITS));
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      BITSET_STATS_CACHE_RESETS_INC (bset);
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    BITSET_RESET_ (bset, bitno);
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_toggle (bitset src, bitset_bindex bitno)
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return BITSET_TOGGLE_ (src->s.bset, bitno);
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_test (bitset src, bitset_bindex bitno)
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset bset = src->s.bset;
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_windex wordno = bitno / BITSET_WORD_BITS;
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_windex offset = wordno - bset->b.cindex;
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_TESTS_INC (bset);
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (offset < bset->b.csize)
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      BITSET_STATS_CACHE_TESTS_INC (bset);
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return (bset->b.cdata[offset] >> (bitno % BITSET_WORD_BITS)) & 1;
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return BITSET_TEST_ (bset, bitno);
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset_bindex
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_resize (bitset src, bitset_bindex size)
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return BITSET_RESIZE_ (src->s.bset, size);
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset_bindex
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_size (bitset src)
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_SIZE_ (src->s.bset);
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset_bindex
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_count (bitset src)
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_COUNT_ (src->s.bset);
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_empty_p (bitset dst)
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_EMPTY_P_ (dst->s.bset);
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_ones (bitset dst)
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_ONES_ (dst->s.bset);
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_zero (bitset dst)
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_ZERO_ (dst->s.bset);
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_copy (bitset dst, bitset src)
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK2_ (dst, src);
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_COPY_ (dst->s.bset, src->s.bset);
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_disjoint_p (bitset dst, bitset src)
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK2_ (dst, src);
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_DISJOINT_P_ (dst->s.bset, src->s.bset);
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_equal_p (bitset dst, bitset src)
437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK2_ (dst, src);
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_EQUAL_P_ (dst->s.bset, src->s.bset);
440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_not (bitset dst, bitset src)
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK2_ (dst, src);
447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_NOT_ (dst->s.bset, src->s.bset);
448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_subset_p (bitset dst, bitset src)
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK2_ (dst, src);
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_SUBSET_P_ (dst->s.bset, src->s.bset);
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_and (bitset dst, bitset src1, bitset src2)
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_AND_ (dst->s.bset, src1->s.bset, src2->s.bset);
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_and_cmp (bitset dst, bitset src1, bitset src2)
469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_andn (bitset dst, bitset src1, bitset src2)
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_ANDN_ (dst->s.bset, src1->s.bset, src2->s.bset);
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_andn_cmp (bitset dst, bitset src1, bitset src2)
485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_ANDN_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_or (bitset dst, bitset src1, bitset src2)
493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_OR_ (dst->s.bset, src1->s.bset, src2->s.bset);
496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_or_cmp (bitset dst, bitset src1, bitset src2)
501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_xor (bitset dst, bitset src1, bitset src2)
509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_XOR_ (dst->s.bset, src1->s.bset, src2->s.bset);
512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_xor_cmp (bitset dst, bitset src1, bitset src2)
517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK3_ (dst, src1, src2);
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_XOR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK4_ (dst, src1, src2, src3);
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_AND_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK4_ (dst, src1, src2, src3);
535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_AND_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK4_ (dst, src1, src2, src3);
543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_ANDN_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK4_ (dst, src1, src2, src3);
551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_ANDN_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK4_ (dst, src1, src2, src3);
559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_OR_AND_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_CHECK4_ (dst, src1, src2, src3);
567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_OR_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset_bindex
572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_list (bitset bset, bitset_bindex *list,
573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		   bitset_bindex num, bitset_bindex *next)
574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_bindex count;
576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_bindex tmp;
577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_bindex size;
578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_bindex i;
579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  count = BITSET_LIST_ (bset->s.bset, list, num, next);
581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_LISTS_INC (bset->s.bset);
583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Log histogram of number of set bits.  */
585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0, tmp = count; tmp; tmp >>= 1, i++)
586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     continue;
587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (i >= BITSET_LOG_COUNT_BINS)
588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     i = BITSET_LOG_COUNT_BINS - 1;
589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_LIST_COUNTS_INC (bset->s.bset, i);
590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Log histogram of number of bits in set.  */
592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size = BITSET_SIZE_ (bset->s.bset);
593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0, tmp = size; tmp; tmp >>= 1, i++)
594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     continue;
595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (i >= BITSET_LOG_SIZE_BINS)
596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     i = BITSET_LOG_SIZE_BINS - 1;
597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_LIST_SIZES_INC (bset->s.bset, i);
598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Histogram of fraction of bits set.  */
600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  i = size ? (count * BITSET_DENSITY_BINS) / size : 0;
601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (i >= BITSET_DENSITY_BINS)
602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     i = BITSET_DENSITY_BINS - 1;
603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_LIST_DENSITY_INC (bset->s.bset, i);
604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return count;
605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset_bindex
609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_list_reverse (bitset bset, bitset_bindex *list,
610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			   bitset_bindex num, bitset_bindex *next)
611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return BITSET_LIST_REVERSE_ (bset->s.bset, list, num, next);
613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_free (bitset bset)
618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_FREES_INC (bset->s.bset);
620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_FREE_ (bset->s.bset);
621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct bitset_vtable bitset_stats_vtable = {
625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_set,
626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_reset,
627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_toggle,
628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_test,
629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_resize,
630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_size,
631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_count,
632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_empty_p,
633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_ones,
634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_zero,
635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_copy,
636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_disjoint_p,
637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_equal_p,
638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_not,
639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_subset_p,
640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_and,
641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_and_cmp,
642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_andn,
643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_andn_cmp,
644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_or,
645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_or_cmp,
646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_xor,
647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_xor_cmp,
648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_and_or,
649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_and_or_cmp,
650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_andn_or,
651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_andn_or_cmp,
652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_or_and,
653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_or_and_cmp,
654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_list,
655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_list_reverse,
656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_stats_free,
657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS
658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return enclosed bitset type.  */
662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum bitset_type
663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_type_get (bitset bset)
664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   return BITSET_TYPE_ (bset->s.bset);
666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize_t
670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_bytes (void)
671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return sizeof (struct bitset_stats_struct);
673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset
677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbitset_stats_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t bytes;
680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset sbset;
681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bset->b.vtable = &bitset_stats_vtable;
683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Disable cache.  */
685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bset->b.cindex = 0;
686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bset->b.csize = 0;
687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bset->b.cdata = 0;
688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_NBITS_ (bset) = n_bits;
690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Set up the actual bitset implementation that
692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     we are a wrapper over.  */
693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  switch (type)
694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    default:
696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      abort ();
697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    case BITSET_ARRAY:
699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bytes = abitset_bytes (n_bits);
700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sbset = xcalloc (1, bytes);
701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      abitset_init (sbset, n_bits);
702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      break;
703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    case BITSET_LIST:
705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bytes = lbitset_bytes (n_bits);
706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sbset = xcalloc (1, bytes);
707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      lbitset_init (sbset, n_bits);
708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      break;
709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    case BITSET_TABLE:
711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bytes = ebitset_bytes (n_bits);
712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sbset = xcalloc (1, bytes);
713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ebitset_init (sbset, n_bits);
714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      break;
715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    case BITSET_VARRAY:
717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bytes = vbitset_bytes (n_bits);
718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sbset = xcalloc (1, bytes);
719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      vbitset_init (sbset, n_bits);
720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      break;
721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bset->s.bset = sbset;
724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_STATS_ALLOCS_INC (type);
726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return bset;
728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
729