Initial revision
From-SVN: r26263
This commit is contained in:
parent
140fa895c6
commit
ee9dd3721b
370 changed files with 173494 additions and 0 deletions
183
libjava/java/util/BitSet.java
Normal file
183
libjava/java/util/BitSet.java
Normal file
|
@ -0,0 +1,183 @@
|
|||
// 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 <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);
|
||||
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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue