aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/BitSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/BitSet.java')
-rw-r--r--libjava/java/util/BitSet.java183
1 files changed, 183 insertions, 0 deletions
diff --git a/libjava/java/util/BitSet.java b/libjava/java/util/BitSet.java
new file mode 100644
index 0000000..e588695
--- /dev/null
+++ b/libjava/java/util/BitSet.java
@@ -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;
+}