1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
/*
* libbrlapi - A library providing access to braille terminals for applications.
*
* Copyright (C) 2006-2025 by
* Samuel Thibault <Samuel.Thibault@ens-lyon.org>
* Sébastien Hinderer <Sebastien.Hinderer@ens-lyon.org>
*
* libbrlapi comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
package org.a11y.brlapi;
import java.util.Arrays;
public class BitMask extends Component {
private final static int BYTE_SIZE = Byte.SIZE;
private final byte[] maskBytes;
private final int maskSize;
public BitMask (byte[] bytes) {
maskBytes = bytes;
maskSize = maskBytes.length * BYTE_SIZE;
}
public int getSize () {
return maskSize;
}
public boolean isSet (int index) {
if (index < 0) return false;
if (index >= maskSize) return false;
int bit = 1 << (index % BYTE_SIZE);
index /= BYTE_SIZE;
return (maskBytes[index] & bit) != 0;
}
private int[] bitNumbers = null;
private final int[] newBitNumbers () {
int size = getSize();
int[] buffer = new int[size];
int count = 0;
int start = 0;
for (int bits : maskBytes) {
if ((bits &= BYTE_MASK) != 0) {
int bit = start;
while (true) {
if ((bits & 1) != 0) buffer[count++] = bit;
if ((bits >>= 1) == 0) break;
bit += 1;
}
}
start += BYTE_SIZE;
}
int[] result = new int[count];
System.arraycopy(buffer, 0, result, 0, count);
return result;
}
public final int[] getBitNumbers () {
synchronized (this) {
if (bitNumbers == null) bitNumbers = newBitNumbers();
}
int count = bitNumbers.length;
int[] result = new int[count];
System.arraycopy(bitNumbers, 0, result, 0, count);
return result;
}
@Override
public String toString () {
return Arrays.toString(getBitNumbers());
}
}
|