1999-04-07 22:42:40 +08:00
|
|
|
// BitSet - A vector of bits.
|
|
|
|
|
2000-01-20 02:39:27 +08:00
|
|
|
/* Copyright (C) 1998, 1999 Red Hat, Inc.
|
1999-04-07 22:42:40 +08:00
|
|
|
|
|
|
|
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 <tromey@cygnus.com>
|
|
|
|
* @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);
|
1999-08-12 05:30:31 +08:00
|
|
|
bits[offset] &= ~ (1L << bit);
|
1999-04-07 22:42:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
1999-08-12 05:30:31 +08:00
|
|
|
return (bits[offset] & (1L << bit)) == 0 ? false : true;
|
1999-04-07 22:42:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
1999-08-12 05:30:31 +08:00
|
|
|
bits[offset] |= 1L << bit;
|
1999-04-07 22:42:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|