blob: 290c3496278b07114072b4f5ff862808cb4629ae [file] [log] [blame] [edit]
/*
* libbrlapi - A library providing access to braille terminals for applications.
*
* Copyright (C) 2006-2023 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());
}
}