Blame lib/bitset_stats.c

Packit Service c3aa71
/* Bitset statistics.
Packit Service c3aa71
Packit Service c3aa71
   Copyright (C) 2002-2006, 2009-2015 Free Software Foundation, Inc.
Packit Service c3aa71
Packit Service c3aa71
   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
Packit Service c3aa71
Packit Service c3aa71
   This program is free software: you can redistribute it and/or modify
Packit Service c3aa71
   it under the terms of the GNU General Public License as published by
Packit Service c3aa71
   the Free Software Foundation, either version 3 of the License, or
Packit Service c3aa71
   (at your option) any later version.
Packit Service c3aa71
Packit Service c3aa71
   This program is distributed in the hope that it will be useful,
Packit Service c3aa71
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service c3aa71
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service c3aa71
   GNU General Public License for more details.
Packit Service c3aa71
Packit Service c3aa71
   You should have received a copy of the GNU General Public License
Packit Service c3aa71
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service c3aa71
Packit Service c3aa71
/* This file is a wrapper bitset implementation for the other bitset
Packit Service c3aa71
   implementations.  It provides bitset compatibility checking and
Packit Service c3aa71
   statistics gathering without having to instrument the bitset
Packit Service c3aa71
   implementations.  When statistics gathering is enabled, the bitset
Packit Service c3aa71
   operations get vectored through here and we then call the appropriate
Packit Service c3aa71
   routines.  */
Packit Service c3aa71
Packit Service c3aa71
#include <config.h>
Packit Service c3aa71
Packit Service c3aa71
#include "bitset_stats.h"
Packit Service c3aa71
Packit Service c3aa71
#include "bbitset.h"
Packit Service c3aa71
#include "abitset.h"
Packit Service c3aa71
#include "ebitset.h"
Packit Service c3aa71
#include "lbitset.h"
Packit Service c3aa71
#include "vbitset.h"
Packit Service c3aa71
#include <stdlib.h>
Packit Service c3aa71
#include <string.h>
Packit Service c3aa71
#include <stdio.h>
Packit Service c3aa71
Packit Service c3aa71
#include "gettext.h"
Packit Service c3aa71
#define _(Msgid)  gettext (Msgid)
Packit Service c3aa71
Packit Service c3aa71
/* Configuration macros.  */
Packit Service c3aa71
#define BITSET_STATS_FILE "bitset.dat"
Packit Service c3aa71
#define BITSET_LOG_COUNT_BINS 10
Packit Service c3aa71
#define BITSET_LOG_SIZE_BINS  16
Packit Service c3aa71
#define BITSET_DENSITY_BINS  20
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Accessor macros.  */
Packit Service c3aa71
#define BITSET_STATS_ALLOCS_INC(TYPE)                   \
Packit Service c3aa71
    bitset_stats_info->types[(TYPE)].allocs++
Packit Service c3aa71
#define BITSET_STATS_FREES_INC(BSET)                    \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].frees++
Packit Service c3aa71
#define BITSET_STATS_SETS_INC(BSET)                     \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].sets++
Packit Service c3aa71
#define BITSET_STATS_CACHE_SETS_INC(BSET)               \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_sets++
Packit Service c3aa71
#define BITSET_STATS_RESETS_INC(BSET)                   \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].resets++
Packit Service c3aa71
#define BITSET_STATS_CACHE_RESETS_INC(BSET)             \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_resets++
Packit Service c3aa71
#define BITSET_STATS_TESTS_INC(BSET)                    \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].tests++
Packit Service c3aa71
#define BITSET_STATS_CACHE_TESTS_INC(BSET)              \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_tests++
Packit Service c3aa71
#define BITSET_STATS_LISTS_INC(BSET)                    \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].lists++
Packit Service c3aa71
#define BITSET_STATS_LIST_COUNTS_INC(BSET, I)           \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_counts[(I)]++
Packit Service c3aa71
#define BITSET_STATS_LIST_SIZES_INC(BSET, I)            \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_sizes[(I)]++
Packit Service c3aa71
#define BITSET_STATS_LIST_DENSITY_INC(BSET, I)          \
Packit Service c3aa71
    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_density[(I)]++
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
struct bitset_type_info_struct
Packit Service c3aa71
{
Packit Service c3aa71
  unsigned int allocs;
Packit Service c3aa71
  unsigned int frees;
Packit Service c3aa71
  unsigned int lists;
Packit Service c3aa71
  unsigned int sets;
Packit Service c3aa71
  unsigned int cache_sets;
Packit Service c3aa71
  unsigned int resets;
Packit Service c3aa71
  unsigned int cache_resets;
Packit Service c3aa71
  unsigned int tests;
Packit Service c3aa71
  unsigned int cache_tests;
Packit Service c3aa71
  unsigned int list_counts[BITSET_LOG_COUNT_BINS];
Packit Service c3aa71
  unsigned int list_sizes[BITSET_LOG_SIZE_BINS];
Packit Service c3aa71
  unsigned int list_density[BITSET_DENSITY_BINS];
Packit Service c3aa71
};
Packit Service c3aa71
Packit Service c3aa71
struct bitset_stats_info_struct
Packit Service c3aa71
{
Packit Service c3aa71
  unsigned int runs;
Packit Service c3aa71
  struct bitset_type_info_struct types[BITSET_TYPE_NUM];
Packit Service c3aa71
};
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
struct bitset_stats_info_struct bitset_stats_info_data;
Packit Service c3aa71
struct bitset_stats_info_struct *bitset_stats_info;
Packit Service c3aa71
bool bitset_stats_enabled = false;
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Print a percentage histogram with message MSG to FILE.  */
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_percent_histogram_print (FILE *file, const char *name, const char *msg,
Packit Service c3aa71
                                unsigned int n_bins, unsigned int *bins)
Packit Service c3aa71
{
Packit Service c3aa71
  unsigned int i;
Packit Service c3aa71
  unsigned int total;
Packit Service c3aa71
Packit Service c3aa71
  total = 0;
Packit Service c3aa71
  for (i = 0; i < n_bins; i++)
Packit Service c3aa71
    total += bins[i];
Packit Service c3aa71
Packit Service c3aa71
  if (!total)
Packit Service c3aa71
    return;
Packit Service c3aa71
Packit Service c3aa71
  fprintf (file, "%s %s", name, msg);
Packit Service c3aa71
  for (i = 0; i < n_bins; i++)
Packit Service c3aa71
    fprintf (file, "%.0f-%.0f%%\t%8u (%5.1f%%)\n",
Packit Service c3aa71
             i * 100.0 / n_bins,
Packit Service c3aa71
             (i + 1) * 100.0 / n_bins, bins[i],
Packit Service c3aa71
             (100.0 * bins[i]) / total);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Print a log histogram with message MSG to FILE.  */
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_log_histogram_print (FILE *file, const char *name, const char *msg,
Packit Service c3aa71
                            unsigned int n_bins, unsigned int *bins)
Packit Service c3aa71
{
Packit Service c3aa71
  unsigned int i;
Packit Service c3aa71
  unsigned int total;
Packit Service c3aa71
  unsigned int max_width;
Packit Service c3aa71
Packit Service c3aa71
  total = 0;
Packit Service c3aa71
  for (i = 0; i < n_bins; i++)
Packit Service c3aa71
    total += bins[i];
Packit Service c3aa71
Packit Service c3aa71
  if (!total)
Packit Service c3aa71
    return;
Packit Service c3aa71
Packit Service c3aa71
  /* Determine number of useful bins.  */
Packit Service c3aa71
  for (i = n_bins; i > 3 && ! bins[i - 1]; i--)
Packit Service c3aa71
     continue;
Packit Service c3aa71
  n_bins = i;
Packit Service c3aa71
Packit Service c3aa71
  /* 2 * ceil (log10 (2) * (N - 1)) + 1.  */
Packit Service c3aa71
  max_width = 2 * (unsigned int) (0.30103 * (n_bins - 1) + 0.9999) + 1;
Packit Service c3aa71
Packit Service c3aa71
  fprintf (file, "%s %s", name, msg);
Packit Service c3aa71
  for (i = 0; i < 2; i++)
Packit Service c3aa71
    fprintf (file, "%*d\t%8u (%5.1f%%)\n",
Packit Service c3aa71
             max_width, i, bins[i], 100.0 * bins[i] / total);
Packit Service c3aa71
Packit Service c3aa71
  for (; i < n_bins; i++)
Packit Service c3aa71
    fprintf (file, "%*lu-%lu\t%8u (%5.1f%%)\n",
Packit Service c3aa71
             max_width - ((unsigned int) (0.30103 * (i) + 0.9999) + 1),
Packit Service c3aa71
             1UL << (i - 1),
Packit Service c3aa71
             (1UL << i) - 1,
Packit Service c3aa71
             bins[i],
Packit Service c3aa71
             (100.0 * bins[i]) / total);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Print bitset statistics to FILE.  */
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_print_1 (FILE *file, const char *name,
Packit Service c3aa71
                      struct bitset_type_info_struct *stats)
Packit Service c3aa71
{
Packit Service c3aa71
  if (!stats)
Packit Service c3aa71
    return;
Packit Service c3aa71
Packit Service c3aa71
  fprintf (file, "%s:\n", name);
Packit Service c3aa71
  fprintf (file, _("%u bitset_allocs, %u freed (%.2f%%).\n"),
Packit Service c3aa71
           stats->allocs, stats->frees,
Packit Service c3aa71
           stats->allocs ? 100.0 * stats->frees / stats->allocs : 0);
Packit Service c3aa71
  fprintf (file, _("%u bitset_sets, %u cached (%.2f%%)\n"),
Packit Service c3aa71
           stats->sets, stats->cache_sets,
Packit Service c3aa71
           stats->sets ? 100.0 * stats->cache_sets / stats->sets : 0);
Packit Service c3aa71
  fprintf (file, _("%u bitset_resets, %u cached (%.2f%%)\n"),
Packit Service c3aa71
           stats->resets, stats->cache_resets,
Packit Service c3aa71
           stats->resets ? 100.0 * stats->cache_resets / stats->resets : 0);
Packit Service c3aa71
  fprintf (file, _("%u bitset_tests, %u cached (%.2f%%)\n"),
Packit Service c3aa71
           stats->tests, stats->cache_tests,
Packit Service c3aa71
           stats->tests ? 100.0 * stats->cache_tests / stats->tests : 0);
Packit Service c3aa71
Packit Service c3aa71
  fprintf (file, _("%u bitset_lists\n"), stats->lists);
Packit Service c3aa71
Packit Service c3aa71
  bitset_log_histogram_print (file, name, _("count log histogram\n"),
Packit Service c3aa71
                              BITSET_LOG_COUNT_BINS, stats->list_counts);
Packit Service c3aa71
Packit Service c3aa71
  bitset_log_histogram_print (file, name, _("size log histogram\n"),
Packit Service c3aa71
                              BITSET_LOG_SIZE_BINS, stats->list_sizes);
Packit Service c3aa71
Packit Service c3aa71
  bitset_percent_histogram_print (file, name, _("density histogram\n"),
Packit Service c3aa71
                                  BITSET_DENSITY_BINS, stats->list_density);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Print all bitset statistics to FILE.  */
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_print (FILE *file, bool verbose ATTRIBUTE_UNUSED)
Packit Service c3aa71
{
Packit Service c3aa71
  int i;
Packit Service c3aa71
Packit Service c3aa71
  if (!bitset_stats_info)
Packit Service c3aa71
    return;
Packit Service c3aa71
Packit Service c3aa71
  fprintf (file, _("Bitset statistics:\n\n"));
Packit Service c3aa71
Packit Service c3aa71
  if (bitset_stats_info->runs > 1)
Packit Service c3aa71
    fprintf (file, _("Accumulated runs = %u\n"), bitset_stats_info->runs);
Packit Service c3aa71
Packit Service c3aa71
  for (i = 0; i < BITSET_TYPE_NUM; i++)
Packit Service c3aa71
    bitset_stats_print_1 (file, bitset_type_names[i],
Packit Service c3aa71
                          &bitset_stats_info->types[i]);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Initialise bitset statistics logging.  */
Packit Service c3aa71
void
Packit Service c3aa71
bitset_stats_enable (void)
Packit Service c3aa71
{
Packit Service c3aa71
  if (!bitset_stats_info)
Packit Service c3aa71
    bitset_stats_info = &bitset_stats_info_data;
Packit Service c3aa71
  bitset_stats_enabled = true;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
void
Packit Service c3aa71
bitset_stats_disable (void)
Packit Service c3aa71
{
Packit Service c3aa71
  bitset_stats_enabled = false;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Read bitset statistics file.  */
Packit Service c3aa71
void
Packit Service c3aa71
bitset_stats_read (const char *file_name)
Packit Service c3aa71
{
Packit Service c3aa71
  FILE *file;
Packit Service c3aa71
Packit Service c3aa71
  if (!bitset_stats_info)
Packit Service c3aa71
    return;
Packit Service c3aa71
Packit Service c3aa71
  if (!file_name)
Packit Service c3aa71
    file_name = BITSET_STATS_FILE;
Packit Service c3aa71
Packit Service c3aa71
  file = fopen (file_name, "r");
Packit Service c3aa71
  if (file)
Packit Service c3aa71
    {
Packit Service c3aa71
      if (fread (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
Packit Service c3aa71
                 1, file) != 1)
Packit Service c3aa71
        {
Packit Service c3aa71
          if (ferror (file))
Packit Service c3aa71
            perror (_("cannot read stats file"));
Packit Service c3aa71
          else
Packit Service c3aa71
            fprintf (stderr, _("bad stats file size\n"));
Packit Service c3aa71
        }
Packit Service c3aa71
      if (fclose (file) != 0)
Packit Service c3aa71
        perror (_("cannot read stats file"));
Packit Service c3aa71
    }
Packit Service c3aa71
  bitset_stats_info_data.runs++;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Write bitset statistics file.  */
Packit Service c3aa71
void
Packit Service c3aa71
bitset_stats_write (const char *file_name)
Packit Service c3aa71
{
Packit Service c3aa71
  FILE *file;
Packit Service c3aa71
Packit Service c3aa71
  if (!bitset_stats_info)
Packit Service c3aa71
    return;
Packit Service c3aa71
Packit Service c3aa71
  if (!file_name)
Packit Service c3aa71
    file_name = BITSET_STATS_FILE;
Packit Service c3aa71
Packit Service c3aa71
  file = fopen (file_name, "w");
Packit Service c3aa71
  if (file)
Packit Service c3aa71
    {
Packit Service c3aa71
      if (fwrite (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
Packit Service c3aa71
                  1, file) != 1)
Packit Service c3aa71
        perror (_("cannot write stats file"));
Packit Service c3aa71
      if (fclose (file) != 0)
Packit Service c3aa71
        perror (_("cannot write stats file"));
Packit Service c3aa71
    }
Packit Service c3aa71
  else
Packit Service c3aa71
    perror (_("cannot open stats file for writing"));
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Dump bitset statistics to FILE.  */
Packit Service c3aa71
void
Packit Service c3aa71
bitset_stats_dump (FILE *file)
Packit Service c3aa71
{
Packit Service c3aa71
  bitset_stats_print (file, false);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Function to be called from debugger to print bitset stats.  */
Packit Service c3aa71
void
Packit Service c3aa71
debug_bitset_stats (void)
Packit Service c3aa71
{
Packit Service c3aa71
  bitset_stats_print (stderr, true);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_set (bitset dst, bitset_bindex bitno)
Packit Service c3aa71
{
Packit Service c3aa71
  bitset bset = dst->s.bset;
Packit Service c3aa71
  bitset_windex wordno = bitno / BITSET_WORD_BITS;
Packit Service c3aa71
  bitset_windex offset = wordno - bset->b.cindex;
Packit Service c3aa71
Packit Service c3aa71
  BITSET_STATS_SETS_INC (bset);
Packit Service c3aa71
Packit Service c3aa71
  if (offset < bset->b.csize)
Packit Service c3aa71
    {
Packit Service c3aa71
      bset->b.cdata[offset] |= (bitset_word) 1 << (bitno % BITSET_WORD_BITS);
Packit Service c3aa71
      BITSET_STATS_CACHE_SETS_INC (bset);
Packit Service c3aa71
    }
Packit Service c3aa71
  else
Packit Service c3aa71
    BITSET_SET_ (bset, bitno);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_reset (bitset dst, bitset_bindex bitno)
Packit Service c3aa71
{
Packit Service c3aa71
  bitset bset = dst->s.bset;
Packit Service c3aa71
  bitset_windex wordno = bitno / BITSET_WORD_BITS;
Packit Service c3aa71
  bitset_windex offset = wordno - bset->b.cindex;
Packit Service c3aa71
Packit Service c3aa71
  BITSET_STATS_RESETS_INC (bset);
Packit Service c3aa71
Packit Service c3aa71
  if (offset < bset->b.csize)
Packit Service c3aa71
    {
Packit Service c3aa71
      bset->b.cdata[offset] &=
Packit Service c3aa71
        ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS));
Packit Service c3aa71
      BITSET_STATS_CACHE_RESETS_INC (bset);
Packit Service c3aa71
    }
Packit Service c3aa71
  else
Packit Service c3aa71
    BITSET_RESET_ (bset, bitno);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_toggle (bitset src, bitset_bindex bitno)
Packit Service c3aa71
{
Packit Service c3aa71
    return BITSET_TOGGLE_ (src->s.bset, bitno);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_test (bitset src, bitset_bindex bitno)
Packit Service c3aa71
{
Packit Service c3aa71
  bitset bset = src->s.bset;
Packit Service c3aa71
  bitset_windex wordno = bitno / BITSET_WORD_BITS;
Packit Service c3aa71
  bitset_windex offset = wordno - bset->b.cindex;
Packit Service c3aa71
Packit Service c3aa71
  BITSET_STATS_TESTS_INC (bset);
Packit Service c3aa71
Packit Service c3aa71
  if (offset < bset->b.csize)
Packit Service c3aa71
    {
Packit Service c3aa71
      BITSET_STATS_CACHE_TESTS_INC (bset);
Packit Service c3aa71
      return (bset->b.cdata[offset] >> (bitno % BITSET_WORD_BITS)) & 1;
Packit Service c3aa71
    }
Packit Service c3aa71
  else
Packit Service c3aa71
    return BITSET_TEST_ (bset, bitno);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bitset_bindex
Packit Service c3aa71
bitset_stats_resize (bitset src, bitset_bindex size)
Packit Service c3aa71
{
Packit Service c3aa71
    return BITSET_RESIZE_ (src->s.bset, size);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bitset_bindex
Packit Service c3aa71
bitset_stats_size (bitset src)
Packit Service c3aa71
{
Packit Service c3aa71
  return BITSET_SIZE_ (src->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bitset_bindex
Packit Service c3aa71
bitset_stats_count (bitset src)
Packit Service c3aa71
{
Packit Service c3aa71
  return BITSET_COUNT_ (src->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_empty_p (bitset dst)
Packit Service c3aa71
{
Packit Service c3aa71
  return BITSET_EMPTY_P_ (dst->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_ones (bitset dst)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_ONES_ (dst->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_zero (bitset dst)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_ZERO_ (dst->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_copy (bitset dst, bitset src)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK2_ (dst, src);
Packit Service c3aa71
  BITSET_COPY_ (dst->s.bset, src->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_disjoint_p (bitset dst, bitset src)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK2_ (dst, src);
Packit Service c3aa71
  return BITSET_DISJOINT_P_ (dst->s.bset, src->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_equal_p (bitset dst, bitset src)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK2_ (dst, src);
Packit Service c3aa71
  return BITSET_EQUAL_P_ (dst->s.bset, src->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_not (bitset dst, bitset src)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK2_ (dst, src);
Packit Service c3aa71
  BITSET_NOT_ (dst->s.bset, src->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_subset_p (bitset dst, bitset src)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK2_ (dst, src);
Packit Service c3aa71
  return BITSET_SUBSET_P_ (dst->s.bset, src->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_and (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  BITSET_AND_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_and_cmp (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  return BITSET_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_andn (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  BITSET_ANDN_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_andn_cmp (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  return BITSET_ANDN_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_or (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  BITSET_OR_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_or_cmp (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  return BITSET_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_xor (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  BITSET_XOR_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_xor_cmp (bitset dst, bitset src1, bitset src2)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK3_ (dst, src1, src2);
Packit Service c3aa71
  return BITSET_XOR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK4_ (dst, src1, src2, src3);
Packit Service c3aa71
  BITSET_AND_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK4_ (dst, src1, src2, src3);
Packit Service c3aa71
  return BITSET_AND_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK4_ (dst, src1, src2, src3);
Packit Service c3aa71
  BITSET_ANDN_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK4_ (dst, src1, src2, src3);
Packit Service c3aa71
  return BITSET_ANDN_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK4_ (dst, src1, src2, src3);
Packit Service c3aa71
  BITSET_OR_AND_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bool
Packit Service c3aa71
bitset_stats_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_CHECK4_ (dst, src1, src2, src3);
Packit Service c3aa71
  return BITSET_OR_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bitset_bindex
Packit Service c3aa71
bitset_stats_list (bitset bset, bitset_bindex *list,
Packit Service c3aa71
                   bitset_bindex num, bitset_bindex *next)
Packit Service c3aa71
{
Packit Service c3aa71
  bitset_bindex count;
Packit Service c3aa71
  bitset_bindex tmp;
Packit Service c3aa71
  bitset_bindex size;
Packit Service c3aa71
  bitset_bindex i;
Packit Service c3aa71
Packit Service c3aa71
  count = BITSET_LIST_ (bset->s.bset, list, num, next);
Packit Service c3aa71
Packit Service c3aa71
  BITSET_STATS_LISTS_INC (bset->s.bset);
Packit Service c3aa71
Packit Service c3aa71
  /* Log histogram of number of set bits.  */
Packit Service c3aa71
  for (i = 0, tmp = count; tmp; tmp >>= 1, i++)
Packit Service c3aa71
     continue;
Packit Service c3aa71
  if (i >= BITSET_LOG_COUNT_BINS)
Packit Service c3aa71
     i = BITSET_LOG_COUNT_BINS - 1;
Packit Service c3aa71
  BITSET_STATS_LIST_COUNTS_INC (bset->s.bset, i);
Packit Service c3aa71
Packit Service c3aa71
  /* Log histogram of number of bits in set.  */
Packit Service c3aa71
  size = BITSET_SIZE_ (bset->s.bset);
Packit Service c3aa71
  for (i = 0, tmp = size; tmp; tmp >>= 1, i++)
Packit Service c3aa71
     continue;
Packit Service c3aa71
  if (i >= BITSET_LOG_SIZE_BINS)
Packit Service c3aa71
     i = BITSET_LOG_SIZE_BINS - 1;
Packit Service c3aa71
  BITSET_STATS_LIST_SIZES_INC (bset->s.bset, i);
Packit Service c3aa71
Packit Service c3aa71
  /* Histogram of fraction of bits set.  */
Packit Service c3aa71
  i = size ? (count * BITSET_DENSITY_BINS) / size : 0;
Packit Service c3aa71
  if (i >= BITSET_DENSITY_BINS)
Packit Service c3aa71
     i = BITSET_DENSITY_BINS - 1;
Packit Service c3aa71
  BITSET_STATS_LIST_DENSITY_INC (bset->s.bset, i);
Packit Service c3aa71
  return count;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static bitset_bindex
Packit Service c3aa71
bitset_stats_list_reverse (bitset bset, bitset_bindex *list,
Packit Service c3aa71
                           bitset_bindex num, bitset_bindex *next)
Packit Service c3aa71
{
Packit Service c3aa71
  return BITSET_LIST_REVERSE_ (bset->s.bset, list, num, next);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
static void
Packit Service c3aa71
bitset_stats_free (bitset bset)
Packit Service c3aa71
{
Packit Service c3aa71
  BITSET_STATS_FREES_INC (bset->s.bset);
Packit Service c3aa71
  BITSET_FREE_ (bset->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
struct bitset_vtable bitset_stats_vtable = {
Packit Service c3aa71
  bitset_stats_set,
Packit Service c3aa71
  bitset_stats_reset,
Packit Service c3aa71
  bitset_stats_toggle,
Packit Service c3aa71
  bitset_stats_test,
Packit Service c3aa71
  bitset_stats_resize,
Packit Service c3aa71
  bitset_stats_size,
Packit Service c3aa71
  bitset_stats_count,
Packit Service c3aa71
  bitset_stats_empty_p,
Packit Service c3aa71
  bitset_stats_ones,
Packit Service c3aa71
  bitset_stats_zero,
Packit Service c3aa71
  bitset_stats_copy,
Packit Service c3aa71
  bitset_stats_disjoint_p,
Packit Service c3aa71
  bitset_stats_equal_p,
Packit Service c3aa71
  bitset_stats_not,
Packit Service c3aa71
  bitset_stats_subset_p,
Packit Service c3aa71
  bitset_stats_and,
Packit Service c3aa71
  bitset_stats_and_cmp,
Packit Service c3aa71
  bitset_stats_andn,
Packit Service c3aa71
  bitset_stats_andn_cmp,
Packit Service c3aa71
  bitset_stats_or,
Packit Service c3aa71
  bitset_stats_or_cmp,
Packit Service c3aa71
  bitset_stats_xor,
Packit Service c3aa71
  bitset_stats_xor_cmp,
Packit Service c3aa71
  bitset_stats_and_or,
Packit Service c3aa71
  bitset_stats_and_or_cmp,
Packit Service c3aa71
  bitset_stats_andn_or,
Packit Service c3aa71
  bitset_stats_andn_or_cmp,
Packit Service c3aa71
  bitset_stats_or_and,
Packit Service c3aa71
  bitset_stats_or_and_cmp,
Packit Service c3aa71
  bitset_stats_list,
Packit Service c3aa71
  bitset_stats_list_reverse,
Packit Service c3aa71
  bitset_stats_free,
Packit Service c3aa71
  BITSET_STATS
Packit Service c3aa71
};
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
/* Return enclosed bitset type.  */
Packit Service c3aa71
enum bitset_type
Packit Service c3aa71
bitset_stats_type_get (bitset bset)
Packit Service c3aa71
{
Packit Service c3aa71
   return BITSET_TYPE_ (bset->s.bset);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
size_t
Packit Service c3aa71
bitset_stats_bytes (void)
Packit Service c3aa71
{
Packit Service c3aa71
  return sizeof (struct bitset_stats_struct);
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
bitset
Packit Service c3aa71
bitset_stats_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
Packit Service c3aa71
{
Packit Service c3aa71
  size_t bytes;
Packit Service c3aa71
  bitset sbset;
Packit Service c3aa71
Packit Service c3aa71
  bset->b.vtable = &bitset_stats_vtable;
Packit Service c3aa71
Packit Service c3aa71
  /* Disable cache.  */
Packit Service c3aa71
  bset->b.cindex = 0;
Packit Service c3aa71
  bset->b.csize = 0;
Packit Service c3aa71
  bset->b.cdata = 0;
Packit Service c3aa71
Packit Service c3aa71
  BITSET_NBITS_ (bset) = n_bits;
Packit Service c3aa71
Packit Service c3aa71
  /* Set up the actual bitset implementation that
Packit Service c3aa71
     we are a wrapper over.  */
Packit Service c3aa71
  switch (type)
Packit Service c3aa71
    {
Packit Service c3aa71
    default:
Packit Service c3aa71
      abort ();
Packit Service c3aa71
Packit Service c3aa71
    case BITSET_ARRAY:
Packit Service c3aa71
      bytes = abitset_bytes (n_bits);
Packit Service c3aa71
      sbset = xcalloc (1, bytes);
Packit Service c3aa71
      abitset_init (sbset, n_bits);
Packit Service c3aa71
      break;
Packit Service c3aa71
Packit Service c3aa71
    case BITSET_LIST:
Packit Service c3aa71
      bytes = lbitset_bytes (n_bits);
Packit Service c3aa71
      sbset = xcalloc (1, bytes);
Packit Service c3aa71
      lbitset_init (sbset, n_bits);
Packit Service c3aa71
      break;
Packit Service c3aa71
Packit Service c3aa71
    case BITSET_TABLE:
Packit Service c3aa71
      bytes = ebitset_bytes (n_bits);
Packit Service c3aa71
      sbset = xcalloc (1, bytes);
Packit Service c3aa71
      ebitset_init (sbset, n_bits);
Packit Service c3aa71
      break;
Packit Service c3aa71
Packit Service c3aa71
    case BITSET_VARRAY:
Packit Service c3aa71
      bytes = vbitset_bytes (n_bits);
Packit Service c3aa71
      sbset = xcalloc (1, bytes);
Packit Service c3aa71
      vbitset_init (sbset, n_bits);
Packit Service c3aa71
      break;
Packit Service c3aa71
    }
Packit Service c3aa71
Packit Service c3aa71
  bset->s.bset = sbset;
Packit Service c3aa71
Packit Service c3aa71
  BITSET_STATS_ALLOCS_INC (type);
Packit Service c3aa71
Packit Service c3aa71
  return bset;
Packit Service c3aa71
}