/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of SableCC. * * See the file "LICENSE" for copyright information and the * * terms and conditions for copying, distribution and * * modification of SableCC. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package org.sablecc.sablecc; public class IntSet { // public static boolean DEBUG = false; private int[] elements = new int[0]; public IntSet() { } private IntSet(IntSet set ) { elements = (int[]) set.elements.clone(); } public void and(IntSet set ) { if (set == this) { return; } int length = 0; int l = 0; int r = 0; while ((l < elements.length) && (r < set.elements.length)) { if (elements[l] < set.elements[r]) { l++; } else if (elements[l] == set.elements[r]) { length++; l++; r++; } else { r++; } } int[] old = elements; elements = new int[length]; length = l = r = 0; while ((l < old.length) && (r < set.elements.length)) { if (old[l] < set.elements[r]) { l++; } else if (old[l] == set.elements[r]) { elements[length++] = old[l]; l++; r++; } else { r++; } } } public void clear(int bit) { elements = new int[0]; } @Override public Object clone() { return new IntSet(this); } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (!(obj instanceof IntSet)) { return false; } IntSet set = (IntSet) obj; if (elements.length != set.elements.length) { return false; } for (int i = 0; i < elements.length; i++) { if (elements[i] != set.elements[i]) { return false; } } return true; } public boolean get (int bit) { int low = 0; int high = elements.length - 1; while (low <= high) { int middle = (low + high) / 2; if (bit < elements[middle]) { high = middle - 1; } else if (bit == elements[middle]) { return true; } else { low = middle + 1; } } return false; } @Override public int hashCode() { int result = 0; for (int i = 0; i < elements.length; i++) { result += elements[i]; } return result; } public void or(IntSet set ) { if (set == this) { return; } // if(DEBUG) // { // System.out.println( // " elements.length:" + elements.length + // " set.elements.length:" + set.elements.length); // } int length = 0; int l = 0; int r = 0; while ((l < elements.length) || (r < set.elements.length)) { // if(DEBUG) // { // System.out.println( // " l:" + l + // " r:" + r + // " length:" + length); // } if ((r == set.elements.length) || ((l != elements.length) && (elements[l] < set.elements[r]))) { length++; l++; } else if ((l == elements.length) || (elements[l] > set.elements[r])) { length++; r++; } else { length++; l++; r++; } } int[] old = elements; elements = new int[length]; length = l = r = 0; while ((l < old.length) || (r < set.elements.length)) { // if(DEBUG) // { // System.out.println( // " l:" + l + // " r:" + r + // " length:" + length); // } if ((r == set.elements.length) || ((l != old.length) && (old[l] < set.elements[r]))) { elements[length++] = old[l]; l++; } else if ((l == old.length) || (old[l] > set.elements[r])) { elements[length++] = set.elements[r]; r++; } else { elements[length++] = old[l]; l++; r++; } } } public void set (int bit) { if (!get (bit)) { int[] old = elements; elements = new int[old.length + 1]; int old_pos = 0; boolean bit_inserted = false; int pos = 0; while (pos < elements.length) { if (!bit_inserted) { if (old_pos < old.length) { if (bit < old[old_pos]) { elements[pos++] = bit; bit_inserted = true; } else { elements[pos++] = old[old_pos++]; } } else { elements[pos++] = bit; bit_inserted = true; } } else { elements[pos++] = old[old_pos++]; } } } } public int size() { if (elements.length == 0) { return 0; } return elements[elements.length - 1] + 1; } @Override public String toString() { StringBuffer s = new StringBuffer(); s.append("{"); boolean comma = false; for (int i = 0; i < elements.length; i++) { if (comma) { s.append(", "); } else { comma = true; } s.append(elements[i]); } s.append("}"); return s.toString(); } public void xor(IntSet set ) { if (set == this) { set = (IntSet) set.clone(); } int length = 0; int l = 0; int r = 0; while ((l < elements.length) || (r < set.elements.length)) { if ((r == set.elements.length) || ((l != elements.length) && (elements[l] < set.elements[r]))) { length++; l++; } else if ((l == elements.length) || (elements[l] > set.elements[r])) { length++; r++; } else { l++; r++; } } int[] old = elements; elements = new int[length]; length = l = r = 0; while ((l < old.length) || (r < set.elements.length)) { if ((r == set.elements.length) || ((l != old.length) && (old[l] < set.elements[r]))) { elements[length++] = old[l]; l++; } else if ((l == old.length) || (old[l] > set.elements[r])) { elements[length++] = set.elements[r]; r++; } else { l++; r++; } } } public int[] elements() { return (int[]) elements/*.clone()*/; } }