00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 # ifdef DELTA_COMPILER
00029
00030 typedef void (*intDoFn)(int i);
00031
00032
00033
00034 class SimpleBitVector : public ValueObj {
00035 int bits;
00036 public:
00037 SimpleBitVector(int b = 0) { bits = b; }
00038
00039 SimpleBitVector allocate(int l) {
00040 assert(l >= 0 && l < BitsPerWord, "need longer bit vector");
00041 return SimpleBitVector(addNth(bits, l));
00042 }
00043
00044 SimpleBitVector deallocate(int l) {
00045 assert(l >= 0 && l < BitsPerWord, "need longer bit vector");
00046 return SimpleBitVector(subNth(bits, l));
00047 }
00048
00049 bool isAllocated(int l) {
00050 assert(l >= 0 && l < BitsPerWord, "need longer bit vector");
00051 return isSet(bits, l);
00052 }
00053 bool isEmpty() { return bits == 0; }
00054 };
00055
00056 class BitVector: public PrintableResourceObj {
00057 protected:
00058 int maxLength;
00059 int length;
00060 int* bits;
00061
00062 int indexFromNumber(int i) { return i >> LogBitsPerWord; }
00063 int offsetFromNumber(int i) { return lowerBits(i, LogBitsPerWord); }
00064
00065 bool getBitInWord(int i, int o) { return isSet(bits[i], o); }
00066 void setBitInWord(int i, int o) { setNth(bits[i], o); }
00067 void clearBitInWord(int i, int o) { clearNth(bits[i], o); }
00068
00069 int bitsLength(int l) { return indexFromNumber(l - 1) + 1; }
00070
00071 int* createBitString(int l) {
00072 int blen = bitsLength(l);
00073 int* bs = NEW_RESOURCE_ARRAY( int, blen);
00074 set_words(bs, blen, 0);
00075 return bs; }
00076 int* copyBitString(int len) {
00077 assert(len >= maxLength, "can't shorten");
00078 int blen = bitsLength(len);
00079 int* bs = NEW_RESOURCE_ARRAY( int, blen);
00080 int blength = bitsLength(maxLength);
00081 copy_words(bits, bs, blength);
00082 if (blength < blen) set_words(bs + blength, blen - blength, 0);
00083 return bs; }
00084
00085 public:
00086 BitVector(int l) {
00087 assert(l > 0, "should have some length");
00088 length = maxLength = l; bits = createBitString(l); }
00089
00090 protected:
00091 BitVector(int l, int ml, int* bs) {
00092 maxLength = ml; length = l; bits = bs; }
00093
00094 public:
00095 BitVector* copy(int len) {
00096 return new BitVector(length, len, copyBitString(len)); }
00097
00098 bool includes(int i) {
00099 assert(this, "shouldn't be a null pointer");
00100 assert(i >= 0 && i < length, "not in range");
00101 bool b = getBitInWord(indexFromNumber(i), offsetFromNumber(i));
00102 return b; }
00103 void add(int i) {
00104 assert(this, "shouldn't be a null pointer");
00105 assert(i >= 0 && i < length, "not in range");
00106 setBitInWord(indexFromNumber(i), offsetFromNumber(i)); }
00107 void addFromTo(int first, int last);
00108 void remove(int i) {
00109 assert(this, "shouldn't be a null pointer");
00110 assert(i >= 0 && i < length, "not in range");
00111 clearBitInWord(indexFromNumber(i), offsetFromNumber(i)); }
00112 void removeFromTo(int first, int last);
00113
00114
00115 bool unionWith(BitVector* other);
00116 bool intersectWith(BitVector* other);
00117 bool isDisjointFrom(BitVector* other);
00118
00119 void doForAllOnes(intDoFn f);
00120
00121 void setLength(int l) { assert(l < maxLength, "too big"); length = l; }
00122 void clear() { set_words(bits, bitsLength(length), 0); }
00123
00124 void print_short();
00125 void print();
00126
00127 friend class LongRegisterMask;
00128 friend int findFirstUnused(LongRegisterMask** strings, int len, int start);
00129 };
00130
00131 # endif