Use size_t for set elements in GrammarSymbolSet

This commit is contained in:
Charles Baker 2023-06-02 16:20:30 +12:00 • committed by Charles Baker
parent 93160d6200
commit b72f97e34d
2 changed files with 12 additions and 10 deletions

View file

@ -10,10 +10,13 @@
using std::vector;
using namespace lalr;
static const size_t ONE = 1;
static const size_t BITS_PER_ELEMENT = sizeof(size_t) * 8;
GrammarSymbolSet::GrammarSymbolSet( size_t symbols )
: set_()
{
set_.resize( symbols / 8 );
set_.resize( symbols / BITS_PER_ELEMENT );
}
GrammarSymbolSet::GrammarSymbolSet( GrammarSymbolSet&& set )
@ -46,10 +49,10 @@ GrammarSymbolSet& GrammarSymbolSet::operator=( const GrammarSymbolSet& set )
bool GrammarSymbolSet::contains( int symbol_index ) const
{
size_t index = symbol_index / 8;
size_t index = symbol_index / BITS_PER_ELEMENT;
if ( index < set_.size() )
{
unsigned char mask = 1 << (symbol_index % 8);
size_t mask = ONE << (symbol_index % BITS_PER_ELEMENT);
return (set_[index] & mask) != 0;
}
return false;
@ -59,16 +62,15 @@ bool GrammarSymbolSet::insert( const GrammarSymbol* symbol )
{
if ( symbol )
{
int index = symbol->index() / 8;
if ( index >= int(set_.size()) )
size_t index = symbol->index() / BITS_PER_ELEMENT;
if ( index >= set_.size() )
{
set_.insert( set_.end(), index - set_.size() + 1, 0 );
}
unsigned char mask = 1 << (symbol->index() % 8);
size_t mask = ONE << (symbol->index() % BITS_PER_ELEMENT);
if ( !(set_[index] & mask) )
{
set_[index] |= mask;
// symbols_.push_back( symbol );
return true;
}
}
@ -85,8 +87,8 @@ int GrammarSymbolSet::insert( const GrammarSymbolSet& set )
int added = 0;
for ( size_t i = 0; i < set.set_.size(); ++i )
{
unsigned char mask = set_[i];
unsigned char new_mask = mask | set.set_[i];
size_t mask = set_[i];
size_t new_mask = mask | set.set_[i];
if ( mask != new_mask )
{
set_[i] = new_mask;

View file

@ -11,7 +11,7 @@ class GrammarSymbol;
class GrammarSymbolSet
{
std::vector<unsigned char> set_;
std::vector<size_t> set_;
public:
GrammarSymbolSet( size_t symbols );