158551Skris/* Inline Functions for bool-array.{h,cc}. 258551Skris 3228060Sbapt Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc. 4228060Sbapt Written by Douglas C. Schmidt <schmidt@ics.uci.edu> 5228060Sbapt and Bruno Haible <bruno@clisp.org>. 658551Skris 7228060Sbapt This file is part of GNU GPERF. 858551Skris 9228060Sbapt GNU GPERF is free software; you can redistribute it and/or modify 10228060Sbapt it under the terms of the GNU General Public License as published by 11228060Sbapt the Free Software Foundation; either version 2, or (at your option) 12228060Sbapt any later version. 1358551Skris 14228060Sbapt GNU GPERF is distributed in the hope that it will be useful, 15228060Sbapt but WITHOUT ANY WARRANTY; without even the implied warranty of 16228060Sbapt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17228060Sbapt GNU General Public License for more details. 1858551Skris 19228060Sbapt You should have received a copy of the GNU General Public License 20228060Sbapt along with this program; see the file COPYING. 21228060Sbapt If not, write to the Free Software Foundation, Inc., 22228060Sbapt 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 2358551Skris 2458551Skris// This needs: 2558551Skris//#include <stdio.h> 2658551Skris//#include <string.h> 2758551Skris//#include "options.h" 2858551Skris 29228060Sbapt/* Initializes the bit array with room for SIZE bits, numbered from 30228060Sbapt 0 to SIZE-1. */ 3158551SkrisINLINE 32228060SbaptBool_Array::Bool_Array (unsigned int size) 33228060Sbapt : _size (size), 34228060Sbapt _iteration_number (1), 35228060Sbapt _storage_array (new unsigned int [size]) 3658551Skris{ 37228060Sbapt memset (_storage_array, 0, size * sizeof (_storage_array[0])); 3858551Skris if (option[DEBUG]) 3958551Skris fprintf (stderr, "\nbool array size = %d, total bytes = %d\n", 40228060Sbapt _size, 41228060Sbapt static_cast<unsigned int> (_size * sizeof (_storage_array[0]))); 4258551Skris} 4358551Skris 44228060Sbapt/* Sets the specified bit to true. 45228060Sbapt Returns its previous value (false or true). */ 46228060SbaptINLINE bool 47228060SbaptBool_Array::set_bit (unsigned int index) 4858551Skris{ 49228060Sbapt if (_storage_array[index] == _iteration_number) 50228060Sbapt /* The bit was set since the last clear() call. */ 51228060Sbapt return true; 5258551Skris else 5358551Skris { 54228060Sbapt /* The last operation on this bit was clear(). Set it now. */ 55228060Sbapt _storage_array[index] = _iteration_number; 56228060Sbapt return false; 5758551Skris } 5858551Skris} 5958551Skris 60228060Sbapt/* Resets all bits to zero. */ 6158551SkrisINLINE void 62228060SbaptBool_Array::clear () 6358551Skris{ 6458551Skris /* If we wrap around it's time to zero things out again! However, this only 65228060Sbapt occurs once about every 2^32 iterations, so it will not happen more 66228060Sbapt frequently than once per second. */ 6758551Skris 68228060Sbapt if (++_iteration_number == 0) 6958551Skris { 70228060Sbapt _iteration_number = 1; 71228060Sbapt memset (_storage_array, 0, _size * sizeof (_storage_array[0])); 7258551Skris if (option[DEBUG]) 7358551Skris { 74228060Sbapt fprintf (stderr, "(re-initialized bool_array)\n"); 7558551Skris fflush (stderr); 7658551Skris } 7758551Skris } 7858551Skris} 79