1/* This may look like C code, but it is really -*- C++ -*- */ 2 3/* Simple lookup table abstraction implemented as an Iteration Number Array. 4 5 Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc. 6 Written by Douglas C. Schmidt <schmidt@ics.uci.edu> 7 and Bruno Haible <bruno@clisp.org>. 8 9 This file is part of GNU GPERF. 10 11 GNU GPERF is free software; you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation; either version 2, or (at your option) 14 any later version. 15 16 GNU GPERF is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with this program; see the file COPYING. 23 If not, write to the Free Software Foundation, Inc., 24 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 25 26#ifndef bool_array_h 27#define bool_array_h 1 28 29/* A Bool_Array instance is a bit array of fixed size, optimized for being 30 filled sparsely and cleared frequently. For example, when processing 31 tests/chill.gperf, the array will be: 32 - of size 15391, 33 - clear will be called 3509 times, 34 - set_bit will be called 300394 times. 35 With a conventional bit array implementation, clear would be too slow. 36 With a tree/hash based bit array implementation, set_bit would be slower. */ 37 38class Bool_Array 39{ 40public: 41 /* Initializes the bit array with room for SIZE bits, numbered from 42 0 to SIZE-1. */ 43 Bool_Array (unsigned int size); 44 45 /* Frees this object. */ 46 ~Bool_Array (); 47 48 /* Resets all bits to zero. */ 49 void clear (); 50 51 /* Sets the specified bit to true. 52 Returns its previous value (false or true). */ 53 bool set_bit (unsigned int index); 54 55private: 56 /* Size of array. */ 57 unsigned int const _size; 58 59 /* Current iteration number. Always nonzero. Starts out as 1, and is 60 incremented each time clear() is called. */ 61 unsigned int _iteration_number; 62 63 /* For each index, we store in storage_array[index] the iteration_number at 64 the time set_bit(index) was last called. */ 65 unsigned int * const _storage_array; 66}; 67 68#ifdef __OPTIMIZE__ /* efficiency hack! */ 69 70#include <stdio.h> 71#include <string.h> 72#include "options.h" 73#define INLINE inline 74#include "bool-array.icc" 75#undef INLINE 76 77#endif 78 79#endif 80