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 package org.antlr.runtime;
00029
00030 import java.util.List;
00031
00036 public class BitSet implements Cloneable {
00037 protected final static int BITS = 64;
00038 protected final static int LOG_BITS = 6;
00039
00040
00041
00042
00043
00044
00045 protected final static int MOD_MASK = BITS - 1;
00046
00048 protected long bits[];
00049
00051 public BitSet() {
00052 this(BITS);
00053 }
00054
00056 public BitSet(long[] bits_) {
00057 bits = bits_;
00058 }
00059
00061 public BitSet(List items) {
00062 this();
00063 for (int i = 0; i < items.size(); i++) {
00064 Integer v = (Integer) items.get(i);
00065 add(v.intValue());
00066 }
00067 }
00068
00072 public BitSet(int nbits) {
00073 bits = new long[((nbits - 1) >> LOG_BITS) + 1];
00074 }
00075
00076 public static BitSet of(int el) {
00077 BitSet s = new BitSet(el + 1);
00078 s.add(el);
00079 return s;
00080 }
00081
00082 public static BitSet of(int a, int b) {
00083 BitSet s = new BitSet(Math.max(a,b)+1);
00084 s.add(a);
00085 s.add(b);
00086 return s;
00087 }
00088
00089 public static BitSet of(int a, int b, int c) {
00090 BitSet s = new BitSet();
00091 s.add(a);
00092 s.add(b);
00093 s.add(c);
00094 return s;
00095 }
00096
00097 public static BitSet of(int a, int b, int c, int d) {
00098 BitSet s = new BitSet();
00099 s.add(a);
00100 s.add(b);
00101 s.add(c);
00102 s.add(d);
00103 return s;
00104 }
00105
00107 public BitSet or(BitSet a) {
00108 if ( a==null ) {
00109 return this;
00110 }
00111 BitSet s = (BitSet)this.clone();
00112 s.orInPlace(a);
00113 return s;
00114 }
00115
00117 public void add(int el) {
00118 int n = wordNumber(el);
00119 if (n >= bits.length) {
00120 growToInclude(el);
00121 }
00122 bits[n] |= bitMask(el);
00123 }
00124
00129 public void growToInclude(int bit) {
00130 int newSize = Math.max(bits.length << 1, numWordsToHold(bit));
00131 long newbits[] = new long[newSize];
00132 System.arraycopy(bits, 0, newbits, 0, bits.length);
00133 bits = newbits;
00134 }
00135
00136 public void orInPlace(BitSet a) {
00137 if ( a==null ) {
00138 return;
00139 }
00140
00141 if (a.bits.length > bits.length) {
00142 setSize(a.bits.length);
00143 }
00144 int min = Math.min(bits.length, a.bits.length);
00145 for (int i = min - 1; i >= 0; i--) {
00146 bits[i] |= a.bits[i];
00147 }
00148 }
00149
00154 private void setSize(int nwords) {
00155 long newbits[] = new long[nwords];
00156 int n = Math.min(nwords, bits.length);
00157 System.arraycopy(bits, 0, newbits, 0, n);
00158 bits = newbits;
00159 }
00160
00161 private final static long bitMask(int bitNumber) {
00162 int bitPosition = bitNumber & MOD_MASK;
00163 return 1L << bitPosition;
00164 }
00165
00166 public Object clone() {
00167 BitSet s;
00168 try {
00169 s = (BitSet)super.clone();
00170 s.bits = new long[bits.length];
00171 System.arraycopy(bits, 0, s.bits, 0, bits.length);
00172 }
00173 catch (CloneNotSupportedException e) {
00174 throw new InternalError();
00175 }
00176 return s;
00177 }
00178
00179 public int size() {
00180 int deg = 0;
00181 for (int i = bits.length - 1; i >= 0; i--) {
00182 long word = bits[i];
00183 if (word != 0L) {
00184 for (int bit = BITS - 1; bit >= 0; bit--) {
00185 if ((word & (1L << bit)) != 0) {
00186 deg++;
00187 }
00188 }
00189 }
00190 }
00191 return deg;
00192 }
00193
00194 public boolean equals(Object other) {
00195 if ( other == null || !(other instanceof BitSet) ) {
00196 return false;
00197 }
00198
00199 BitSet otherSet = (BitSet)other;
00200
00201 int n = Math.min(this.bits.length, otherSet.bits.length);
00202
00203
00204 for (int i=0; i<n; i++) {
00205 if (this.bits[i] != otherSet.bits[i]) {
00206 return false;
00207 }
00208 }
00209
00210
00211
00212 if (this.bits.length > n) {
00213 for (int i = n+1; i<this.bits.length; i++) {
00214 if (this.bits[i] != 0) {
00215 return false;
00216 }
00217 }
00218 }
00219 else if (otherSet.bits.length > n) {
00220 for (int i = n+1; i<otherSet.bits.length; i++) {
00221 if (otherSet.bits[i] != 0) {
00222 return false;
00223 }
00224 }
00225 }
00226
00227 return true;
00228 }
00229
00230 public boolean member(int el) {
00231 if ( el<0 ) {
00232 return false;
00233 }
00234 int n = wordNumber(el);
00235 if (n >= bits.length) return false;
00236 return (bits[n] & bitMask(el)) != 0;
00237 }
00238
00239
00240 public void remove(int el) {
00241 int n = wordNumber(el);
00242 if (n < bits.length) {
00243 bits[n] &= ~bitMask(el);
00244 }
00245 }
00246
00247 public boolean isNil() {
00248 for (int i = bits.length - 1; i >= 0; i--) {
00249 if (bits[i] != 0) return false;
00250 }
00251 return true;
00252 }
00253
00254 private final int numWordsToHold(int el) {
00255 return (el >> LOG_BITS) + 1;
00256 }
00257
00258 public int numBits() {
00259 return bits.length << LOG_BITS;
00260 }
00261
00265 public int lengthInLongWords() {
00266 return bits.length;
00267 }
00268
00270
00271
00272
00273
00274
00275
00276
00277 public int[] toArray() {
00278 int[] elems = new int[size()];
00279 int en = 0;
00280 for (int i = 0; i < (bits.length << LOG_BITS); i++) {
00281 if (member(i)) {
00282 elems[en++] = i;
00283 }
00284 }
00285 return elems;
00286 }
00287
00288 public long[] toPackedArray() {
00289 return bits;
00290 }
00291
00292 private final static int wordNumber(int bit) {
00293 return bit >> LOG_BITS;
00294 }
00295
00296 public String toString() {
00297 return toString(null);
00298 }
00299
00300 public String toString(String[] tokenNames) {
00301 StringBuffer buf = new StringBuffer();
00302 String separator = ",";
00303 boolean havePrintedAnElement = false;
00304 buf.append('{');
00305
00306 for (int i = 0; i < (bits.length << LOG_BITS); i++) {
00307 if (member(i)) {
00308 if (i > 0 && havePrintedAnElement ) {
00309 buf.append(separator);
00310 }
00311 if ( tokenNames!=null ) {
00312 buf.append(tokenNames[i]);
00313 }
00314 else {
00315 buf.append(i);
00316 }
00317 havePrintedAnElement = true;
00318 }
00319 }
00320 buf.append('}');
00321 return buf.toString();
00322 }
00323
00324
00325 }