144 lines
2.7 KiB
C++
144 lines
2.7 KiB
C++
#pragma once
|
|
|
|
#include <assert.h>
|
|
|
|
#include "MachineTypes.h"
|
|
|
|
class NumberSet
|
|
{
|
|
protected:
|
|
uint32 * bits;
|
|
int size, dwsize;
|
|
public:
|
|
NumberSet(void);
|
|
NumberSet(int size, bool set = false);
|
|
NumberSet(const NumberSet& set);
|
|
~NumberSet(void);
|
|
|
|
void Reset(int size, bool set = false);
|
|
|
|
NumberSet& operator+=(int elem);
|
|
NumberSet& operator-=(int elem);
|
|
|
|
bool operator[](int elem) const;
|
|
|
|
NumberSet& operator=(const NumberSet& set);
|
|
|
|
NumberSet& operator&=(const NumberSet& set);
|
|
NumberSet& operator|=(const NumberSet& set);
|
|
NumberSet& operator-=(const NumberSet& set);
|
|
|
|
bool operator<=(const NumberSet& set) const;
|
|
|
|
void OrNot(const NumberSet& set);
|
|
|
|
void Clear(void);
|
|
void Fill(void);
|
|
void AddRange(int elem, int num);
|
|
void SubRange(int elem, int num);
|
|
bool RangeClear(int elem, int num) const;
|
|
bool RangeFilled(int elem, int num) const;
|
|
|
|
int Size(void) { return size; }
|
|
};
|
|
|
|
inline NumberSet& NumberSet::operator+=(int elem)
|
|
{
|
|
assert(elem >= 0 && elem < size);
|
|
bits[elem >> 5] |= (1UL << (elem & 31));
|
|
|
|
return *this;
|
|
}
|
|
|
|
inline NumberSet& NumberSet::operator-=(int elem)
|
|
{
|
|
assert(elem >= 0 && elem < size);
|
|
bits[elem >> 5] &= ~(1UL << (elem & 31));
|
|
|
|
return *this;
|
|
}
|
|
|
|
inline bool NumberSet::operator[](int elem) const
|
|
{
|
|
assert(elem >= 0 && elem < size);
|
|
return (bits[elem >> 5] & (1UL << (elem & 31))) != 0;
|
|
}
|
|
|
|
|
|
class FastNumberSet
|
|
{
|
|
protected:
|
|
uint32 * buffer;
|
|
int size, num, asize;
|
|
public:
|
|
FastNumberSet(void);
|
|
FastNumberSet(int size, bool set = false);
|
|
FastNumberSet(const FastNumberSet& set);
|
|
~FastNumberSet(void);
|
|
|
|
void Reset(int size, bool set = false);
|
|
|
|
FastNumberSet& operator+=(int elem);
|
|
FastNumberSet& operator-=(int elem);
|
|
|
|
bool operator[](int elem) const;
|
|
|
|
FastNumberSet& operator=(const FastNumberSet& set);
|
|
|
|
bool Empty(void) const { return !num; }
|
|
void Clear(void);
|
|
|
|
int Num(void) const { return num; }
|
|
int Element(int i) const;
|
|
|
|
int Size(void) const { return size; }
|
|
int Index(int elem) const;
|
|
};
|
|
|
|
inline bool FastNumberSet::operator[](int elem) const
|
|
{
|
|
uint32 dw = buffer[size + elem];
|
|
|
|
return (dw < uint32(num) && buffer[dw] == elem);
|
|
}
|
|
|
|
inline FastNumberSet& FastNumberSet::operator+=(int elem)
|
|
{
|
|
assert(elem < size);
|
|
|
|
uint32 dw = buffer[size + elem];
|
|
|
|
if (dw >= uint32(num) || buffer[dw] != elem)
|
|
{
|
|
assert(num < size);
|
|
|
|
buffer[num] = elem;
|
|
buffer[size + elem] = num;
|
|
num++;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
inline FastNumberSet& FastNumberSet::operator-=(int elem)
|
|
{
|
|
uint32 dw = buffer[size + elem];
|
|
|
|
if (dw < uint32(num) && buffer[dw] == elem)
|
|
{
|
|
num--;
|
|
buffer[dw] = buffer[num];
|
|
buffer[size + buffer[dw]] = dw;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
inline int FastNumberSet::Element(int i) const
|
|
{
|
|
if (i < num)
|
|
return buffer[i];
|
|
else
|
|
return -1;
|
|
}
|