+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2008 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ\r
-//\r
-// BitVector.java\r
-// Since: 2008/11/08 9:29:14\r
-//\r
-// $URL$\r
-// $Author$\r
-//--------------------------------------\r
-package org.xerial.util;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-/**\r
- * bit array, which consists of zero (false) or one (true) values\r
- * \r
- * @author leo\r
- * \r
- */\r
-public class BitVector\r
-{\r
- private final static int BIT_LENGTH = 32;\r
- private ArrayList<Integer> bitVector = new ArrayList<Integer>();\r
- private int size = 0;\r
-\r
- public BitVector()\r
- {}\r
-\r
- public BitVector(int size)\r
- {\r
- extend(size - 1);\r
- }\r
-\r
- public void on(int index)\r
- {\r
- set(index, true);\r
- }\r
-\r
- public void off(int index)\r
- {\r
- set(index, false);\r
- }\r
-\r
- public void set(int index, boolean flag)\r
- {\r
- extend(index);\r
-\r
- int pos = pos(index);\r
- int mask = 0x01 << offset(index);\r
-\r
- int value = bitVector.get(pos);\r
- bitVector.set(pos, flag ? (value |= mask) : (value &= ~mask));\r
- }\r
-\r
- public boolean get(int index)\r
- {\r
- int pos = pos(index);\r
- if (pos >= bitVector.size())\r
- return false;\r
-\r
- int value = bitVector.get(pos);\r
- int mask = 0x01 << offset(index);\r
- return (value &= mask) != 0;\r
- }\r
-\r
- private static int pos(int index)\r
- {\r
- return index / BIT_LENGTH;\r
- }\r
-\r
- private static int offset(int index)\r
- {\r
- return index % BIT_LENGTH;\r
- }\r
-\r
- private void extend(int index)\r
- {\r
- if (size <= index)\r
- size = index + 1;\r
-\r
- int pos = pos(index);\r
- if (pos < bitVector.size())\r
- return;\r
-\r
- while (bitVector.size() <= pos)\r
- bitVector.add(0);\r
- }\r
-\r
- @Override\r
- public boolean equals(Object obj)\r
- {\r
- if (!BitVector.class.isInstance(obj))\r
- return false;\r
-\r
- BitVector other = BitVector.class.cast(obj);\r
-\r
- // compare the size\r
- if (size() != other.size())\r
- return false;\r
-\r
- // compare each byte\r
- int byteLength = byteLength();\r
-\r
- for (int i = 0; i < byteLength; i++)\r
- {\r
- if (!this.bitVector.get(i).equals(other.bitVector.get(i)))\r
- return false;\r
- }\r
-\r
- return true;\r
- }\r
-\r
- private int byteLength()\r
- {\r
- int maxBitPos = size() - 1;\r
- if (maxBitPos < 0)\r
- maxBitPos = 0;\r
- return pos(maxBitPos) + (offset(maxBitPos) == 0 ? 0 : 1);\r
- }\r
-\r
- @Override\r
- public int hashCode()\r
- {\r
- int hashValue = 3;\r
-\r
- int byteLength = byteLength();\r
- for (int i = 0; i < byteLength; i++)\r
- {\r
- hashValue += hashValue * 137 + bitVector.get(i);\r
- }\r
-\r
- return hashValue % 1987;\r
- }\r
-\r
- /**\r
- * @param array\r
- */\r
- private BitVector(List<Integer> array, int bitSize)\r
- {\r
- this.size = bitSize;\r
- // copy the array\r
- for (int v : array)\r
- {\r
- this.bitVector.add(v);\r
- }\r
- }\r
-\r
- public static BitVector newInstance(BitVector source)\r
- {\r
- return new BitVector(source.bitVector, source.size);\r
- }\r
-\r
- public static BitVector newInstanceWithAnAdditionalBit(BitVector source, int bitIndexToAdd)\r
- {\r
- BitVector newInstance = new BitVector(source.bitVector, source.size);\r
- newInstance.on(bitIndexToAdd);\r
- return newInstance;\r
- }\r
-\r
- public int size()\r
- {\r
- return size;\r
- }\r
-\r
- public void clear()\r
- {\r
- bitVector.clear();\r
- size = 0;\r
- }\r
-\r
- @Override\r
- public String toString()\r
- {\r
- StringBuilder buf = new StringBuilder();\r
- for (int i = 0; i < size; i++)\r
- buf.append(get(i) ? "1" : "0");\r
- return buf.toString();\r
- }\r
-\r
-}\r