oscar64/oscar64/NumberSet.cpp

268 lines
3.7 KiB
C++

#include "NumberSet.h"
NumberSet::NumberSet(void)
{
size = 0;
dwsize = 0;
bits = 0;
}
NumberSet::NumberSet(int size, bool set)
{
int i;
this->size = size;
dwsize = (size + 31) >> 5;
bits = new uint32[dwsize];
if (set)
{
for (i = 0; i < dwsize; i++)
bits[i] = 0xffffffff;
}
else
{
for (i = 0; i < dwsize; i++)
bits[i] = 0;
}
}
NumberSet::NumberSet(const NumberSet& set)
{
int i;
this->size = set.size;
this->dwsize = set.dwsize;
this->bits = new uint32[dwsize];
for (i = 0; i < dwsize; i++)
bits[i] = set.bits[i];
}
NumberSet::~NumberSet(void)
{
delete[] bits;
}
void NumberSet::Reset(int size, bool set)
{
int i;
int ndwsize = (size + 31) >> 5;
if (this->dwsize != ndwsize)
{
delete[] bits;
dwsize = ndwsize;
bits = new uint32[dwsize];
}
this->size = size;
if (set)
{
for (i = 0; i < dwsize; i++)
bits[i] = 0xffffffff;
}
else
{
for (i = 0; i < dwsize; i++)
bits[i] = 0;
}
}
void NumberSet::Fill(void)
{
int i;
for (i = 0; i < dwsize; i++)
bits[i] = 0xffffffff;
}
void NumberSet::OrNot(const NumberSet& set)
{
int i;
for (i = 0; i < dwsize; i++)
bits[i] |= ~set.bits[i];
}
void NumberSet::Clear(void)
{
int i;
for (i = 0; i < dwsize; i++)
bits[i] = 0;
}
NumberSet& NumberSet::operator=(const NumberSet& set)
{
this->size = set.size;
if (dwsize != set.dwsize)
{
delete[] bits;
this->dwsize = set.dwsize;
this->bits = new uint32[dwsize];
}
int size = dwsize;
const uint32* sbits = set.bits;
uint32* dbits = bits;
for (int i = 0; i < size; i++)
dbits[i] = sbits[i];
return *this;
}
NumberSet& NumberSet::operator&=(const NumberSet& set)
{
int size = dwsize;
const uint32* sbits = set.bits;
uint32* dbits = bits;
for (int i = 0; i < size; i++)
dbits[i] &= sbits[i];
return *this;
}
NumberSet& NumberSet::operator|=(const NumberSet& set)
{
int size = dwsize;
const uint32* sbits = set.bits;
uint32* dbits = bits;
for (int i = 0; i < size; i++)
dbits[i] |= sbits[i];
return *this;
}
NumberSet& NumberSet::operator-=(const NumberSet& set)
{
int i;
for (i = 0; i < dwsize; i++)
bits[i] &= ~set.bits[i];
return *this;
}
bool NumberSet::operator<=(const NumberSet& set) const
{
int i;
for (i = 0; i < dwsize; i++)
if (bits[i] & ~set.bits[i]) return false;
return true;
}
FastNumberSet::FastNumberSet(void)
{
num = 0;
size = 0;
asize = 0;
buffer = nullptr;
}
FastNumberSet::FastNumberSet(int size, bool set)
{
this->size = this->asize = size;
buffer = new uint32[2 * size];
if (set)
{
for (num = 0; num < size; num++)
{
buffer[num] = num;
buffer[num + size] = num;
}
}
else
num = 0;
}
FastNumberSet::FastNumberSet(const FastNumberSet& set)
{
int i;
this->size = this->asize = set.size;
this->num = set.num;
buffer = new uint32[2 * size];
for (i = 0; i < num; i++)
{
buffer[i] = set.buffer[i];
buffer[size + buffer[i]] = i;
}
}
void FastNumberSet::Reset(int size, bool set)
{
if (size > this->asize)
{
delete[] buffer;
buffer = new uint32[2 * size];
this->asize = size;
}
this->size = size;
if (set)
{
for (num = 0; num < size; num++)
{
buffer[num] = num;
buffer[num + size] = num;
}
}
else
num = 0;
}
FastNumberSet::~FastNumberSet(void)
{
delete[] buffer;
}
FastNumberSet& FastNumberSet::operator=(const FastNumberSet& set)
{
if (set.size > this->asize)
{
delete[] buffer;
buffer = new uint32[2 * set.size];
this->asize = set.size;
}
this->size = set.size;
for (num = 0; num < set.num; num++)
{
buffer[num] = set.buffer[num];
buffer[buffer[num] + size] = num;
}
return *this;
}
void FastNumberSet::Clear(void)
{
num = 0;
}
int FastNumberSet::Index(int elem) const
{
uint32 dw = buffer[size + elem];
if (dw < uint32(num) && buffer[dw] == elem)
return dw;
else
return -1;
}