// BitSet - A vector of bits. /* Copyright (C) 1998, 1999 Cygnus Solutions This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package java.util; import java.io.Serializable; /** * @author Tom Tromey * @date October 23, 1998. */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * hashCode algorithm taken from JDK 1.2 docs. */ public final class BitSet implements Cloneable, Serializable { public void and (BitSet bs) { if (bs == null) throw new NullPointerException (); int max = Math.min(bits.length, bs.bits.length); int i; for (i = 0; i < max; ++i) bits[i] &= bs.bits[i]; for ( ; i < bits.length; ++i) bits[i] = 0; } public BitSet () { this (64); } public BitSet (int nbits) { if (nbits < 0) throw new NegativeArraySizeException (); int length = nbits / 64; if (nbits % 64 != 0) ++length; bits = new long[length]; } public void clear (int pos) { if (pos < 0) throw new IndexOutOfBoundsException (); int bit = pos % 64; int offset = pos / 64; ensure (offset); bits[offset] &= ~ (1 << bit); } public Object clone () { BitSet bs = new BitSet (bits.length * 64); System.arraycopy(bits, 0, bs.bits, 0, bits.length); return bs; } public boolean equals (Object obj) { if (! (obj instanceof BitSet)) return false; BitSet bs = (BitSet) obj; int max = Math.min(bits.length, bs.bits.length); int i; for (i = 0; i < max; ++i) if (bits[i] != bs.bits[i]) return false; // If one is larger, check to make sure all extra bits are 0. for (int j = i; j < bits.length; ++j) if (bits[j] != 0) return false; for (int j = i; j < bs.bits.length; ++j) if (bs.bits[j] != 0) return false; return true; } public boolean get (int pos) { if (pos < 0) throw new IndexOutOfBoundsException (); int bit = pos % 64; int offset = pos / 64; if (offset >= bits.length) return false; return (bits[offset] & (1 << bit)) == 0 ? false : true; } public int hashCode () { long h = 1234; for (int i = bits.length - 1; i >= 0; --i) h ^= bits[i] * (i + 1); return (int) ((h >> 32) ^ h); } public void or (BitSet bs) { if (bs == null) throw new NullPointerException (); ensure (bs.bits.length - 1); int i; for (i = 0; i < bs.bits.length; ++i) bits[i] |= bs.bits[i]; } public void set (int pos) { if (pos < 0) throw new IndexOutOfBoundsException (); int bit = pos % 64; int offset = pos / 64; ensure (offset); bits[offset] |= 1 << bit; } public int size () { return bits.length * 64; } public String toString () { StringBuffer result = new StringBuffer ("{"); boolean first = true; for (int i = 0; i < bits.length; ++i) { int bit = 1; long word = bits[i]; for (int j = 0; j < 64; ++j) { if ((word & bit) != 0) { if (! first) result.append(", "); result.append(64 * i + j); first = false; } bit <<= 1; } } return result.append("}").toString(); } public void xor (BitSet bs) { if (bs == null) throw new NullPointerException (); ensure (bs.bits.length - 1); int i; for (i = 0; i < bs.bits.length; ++i) bits[i] ^= bs.bits[i]; } // Make sure the vector is big enough. private final void ensure (int lastElt) { if (lastElt + 1 > bits.length) { long[] nd = new long[lastElt + 1]; System.arraycopy(bits, 0, nd, 0, bits.length); bits = nd; } } // The actual bits. private long[] bits; }