forked from simdjson/simdjson-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBitIndexes.java
More file actions
67 lines (54 loc) · 1.45 KB
/
BitIndexes.java
File metadata and controls
67 lines (54 loc) · 1.45 KB
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
package org.simdjson;
class BitIndexes {
private final int[] indexes;
private int writeIdx;
private int readIdx;
BitIndexes(int capacity) {
indexes = new int[capacity];
}
void write(int blockIndex, long bits) {
if (bits == 0) {
return;
}
int idx = blockIndex - 64;
int cnt = Long.bitCount(bits);
for (int i = 0; i < 8; i++) {
indexes[i + writeIdx] = idx + Long.numberOfTrailingZeros(bits);
bits = clearLowestBit(bits);
}
if (cnt > 8) {
for (int i = 8; i < 16; i++) {
indexes[i + writeIdx] = idx + Long.numberOfTrailingZeros(bits);
bits = clearLowestBit(bits);
}
if (cnt > 16) {
int i = 16;
do {
indexes[i + writeIdx] = idx + Long.numberOfTrailingZeros(bits);
bits = clearLowestBit(bits);
i++;
} while (i < cnt);
}
}
writeIdx += cnt;
}
private long clearLowestBit(long bits) {
return bits & (bits - 1);
}
int advance() {
return indexes[readIdx++];
}
int peek() {
return indexes[readIdx];
}
boolean hasNext() {
return writeIdx > readIdx;
}
boolean isEnd() {
return writeIdx == readIdx;
}
void reset() {
writeIdx = 0;
readIdx = 0;
}
}