X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=csharp%2Fcommon%2FBitArray.cs;fp=csharp%2Fcommon%2FBitArray.cs;h=51f27769051f9e28a2f9a3e3ea7f128b29b0408b;hb=ec1d7dfa5fb34e69b0f65f936eec23c8a8b88b56;hp=0000000000000000000000000000000000000000;hpb=e8f7ac2a4615b772609002f4f903fda2e9474c5c;p=zxing.git
diff --git a/csharp/common/BitArray.cs b/csharp/common/BitArray.cs
new file mode 100755
index 00000000..51f27769
--- /dev/null
+++ b/csharp/common/BitArray.cs
@@ -0,0 +1,208 @@
+/*
+* Copyright 2007 ZXing authors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+using System;
+namespace com.google.zxing.common
+{
+
+ ///
A simple, fast array of bits, represented compactly by an array of ints internally.
+ ///
+ ///
+ /// Sean Owen
+ ///
+ /// www.Redivivus.in (suraj.supekar@redivivus.in) - Ported from ZXING Java Source
+ ///
+ public sealed class BitArray
+ {
+ public int Size
+ {
+ get
+ {
+ return size;
+ }
+
+ }
+
+ // TODO: I have changed these members to be public so ProGuard can inline get() and set(). Ideally
+ // they'd be private and we'd use the -allowaccessmodification flag, but Dalvik rejects the
+ // resulting binary at runtime on Android. If we find a solution to this, these should be changed
+ // back to private.
+ public int[] bits;
+ //UPGRADE_NOTE: Final was removed from the declaration of 'size '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
+ public int size;
+
+ public BitArray(int size)
+ {
+ if (size < 1)
+ {
+ throw new System.ArgumentException("size must be at least 1");
+ }
+ this.size = size;
+ this.bits = makeArray(size);
+ }
+
+ /// bit to get
+ ///
+ /// true iff bit i is set
+ ///
+ public bool get_Renamed(int i)
+ {
+ return (bits[i >> 5] & (1 << (i & 0x1F))) != 0;
+ }
+
+ /// Sets bit i.
+ ///
+ ///
+ /// bit to set
+ ///
+ public void set_Renamed(int i)
+ {
+ bits[i >> 5] |= 1 << (i & 0x1F);
+ }
+
+ /// Flips bit i.
+ ///
+ ///
+ /// bit to set
+ ///
+ public void flip(int i)
+ {
+ bits[i >> 5] ^= 1 << (i & 0x1F);
+ }
+
+ /// Sets a block of 32 bits, starting at bit i.
+ ///
+ ///
+ /// first bit to set
+ ///
+ /// the new value of the next 32 bits. Note again that the least-significant bit
+ /// corresponds to bit i, the next-least-significant to i+1, and so on.
+ ///
+ public void setBulk(int i, int newBits)
+ {
+ bits[i >> 5] = newBits;
+ }
+
+ /// Clears all bits (sets to false).
+ public void clear()
+ {
+ int max = bits.Length;
+ for (int i = 0; i < max; i++)
+ {
+ bits[i] = 0;
+ }
+ }
+
+ /// Efficient method to check if a range of bits is set, or not set.
+ ///
+ ///
+ /// start of range, inclusive.
+ ///
+ /// end of range, exclusive
+ ///
+ /// if true, checks that bits in range are set, otherwise checks that they are not set
+ ///
+ /// true iff all bits are set or not set in range, according to value argument
+ ///
+ /// IllegalArgumentException if end is less than or equal to start
+ public bool isRange(int start, int end, bool value_Renamed)
+ {
+ if (end < start)
+ {
+ throw new System.ArgumentException();
+ }
+ if (end == start)
+ {
+ return true; // empty range matches
+ }
+ end--; // will be easier to treat this as the last actually set bit -- inclusive
+ int firstInt = start >> 5;
+ int lastInt = end >> 5;
+ for (int i = firstInt; i <= lastInt; i++)
+ {
+ int firstBit = i > firstInt?0:start & 0x1F;
+ int lastBit = i < lastInt?31:end & 0x1F;
+ int mask;
+ if (firstBit == 0 && lastBit == 31)
+ {
+ mask = - 1;
+ }
+ else
+ {
+ mask = 0;
+ for (int j = firstBit; j <= lastBit; j++)
+ {
+ mask |= 1 << j;
+ }
+ }
+
+ // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (that is,
+ // equals the mask, or we're looking for 0s and the masked portion is not all 0s
+ if ((bits[i] & mask) != (value_Renamed?mask:0))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /// underlying array of ints. The first element holds the first 32 bits, and the least
+ /// significant bit is bit 0.
+ ///
+ public int[] getBitArray()
+ {
+ return bits;
+ }
+
+ /// Reverses all bits in the array.
+ public void reverse()
+ {
+ int[] newBits = new int[bits.Length];
+ int size = this.size;
+ for (int i = 0; i < size; i++)
+ {
+ if (get_Renamed(size - i - 1))
+ {
+ newBits[i >> 5] |= 1 << (i & 0x1F);
+ }
+ }
+ bits = newBits;
+ }
+
+ private static int[] makeArray(int size)
+ {
+ int arraySize = size >> 5;
+ if ((size & 0x1F) != 0)
+ {
+ arraySize++;
+ }
+ return new int[arraySize];
+ }
+
+ public override System.String ToString()
+ {
+ System.Text.StringBuilder result = new System.Text.StringBuilder(size);
+ for (int i = 0; i < size; i++)
+ {
+ if ((i & 0x07) == 0)
+ {
+ result.Append(' ');
+ }
+ result.Append(get_Renamed(i)?'X':'.');
+ }
+ return result.ToString();
+ }
+ }
+}
\ No newline at end of file