mirror of https://github.com/apache/lucene.git
LUCENE-10125: Another idea of DirectWriter
This commit is contained in:
parent
88b264a368
commit
12ad4bbf75
|
@ -98,21 +98,32 @@ public final class DirectWriter {
|
||||||
off = 0;
|
off = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
private interface Setter {
|
||||||
|
void set(byte[] b, int o, long v);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Setter LONG_SETTER = BitUtil.VH_LE_LONG::set,
|
||||||
|
INT_SETTER = (b, o, v) -> BitUtil.VH_LE_INT.set(b, o, (int) v),
|
||||||
|
SHORT_SETTER = (b, o, v) -> BitUtil.VH_LE_SHORT.set(b, o, (short) v),
|
||||||
|
BYTE_SETTER = (b, o, v) -> b[o] = (byte) v;
|
||||||
|
|
||||||
private static void encode(long[] nextValues, int upTo, byte[] nextBlocks, int bitsPerValue) {
|
private static void encode(long[] nextValues, int upTo, byte[] nextBlocks, int bitsPerValue) {
|
||||||
if ((bitsPerValue & 7) == 0) {
|
if ((bitsPerValue & 7) == 0) {
|
||||||
// bitsPerValue is a multiple of 8: 8, 16, 24, 32, 30, 48, 56, 64
|
// bitsPerValue is a multiple of 8: 8, 16, 24, 32, 30, 48, 56, 64
|
||||||
final int bytesPerValue = bitsPerValue / Byte.SIZE;
|
final int bytesPerValue = bitsPerValue / Byte.SIZE;
|
||||||
|
final Setter setter;
|
||||||
|
if (bitsPerValue > Integer.SIZE) {
|
||||||
|
setter = LONG_SETTER;
|
||||||
|
} else if (bitsPerValue > Short.SIZE) {
|
||||||
|
setter = INT_SETTER;
|
||||||
|
} else if (bitsPerValue > Byte.SIZE) {
|
||||||
|
setter = SHORT_SETTER;
|
||||||
|
} else {
|
||||||
|
setter = BYTE_SETTER;
|
||||||
|
}
|
||||||
for (int i = 0, o = 0; i < upTo; ++i, o += bytesPerValue) {
|
for (int i = 0, o = 0; i < upTo; ++i, o += bytesPerValue) {
|
||||||
final long l = nextValues[i];
|
setter.set(nextBlocks, o, nextValues[i]);
|
||||||
if (bitsPerValue > Integer.SIZE) {
|
|
||||||
BitUtil.VH_LE_LONG.set(nextBlocks, o, l);
|
|
||||||
} else if (bitsPerValue > Short.SIZE) {
|
|
||||||
BitUtil.VH_LE_INT.set(nextBlocks, o, (int) l);
|
|
||||||
} else if (bitsPerValue > Byte.SIZE) {
|
|
||||||
BitUtil.VH_LE_SHORT.set(nextBlocks, o, (short) l);
|
|
||||||
} else {
|
|
||||||
nextBlocks[o] = (byte) l;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (bitsPerValue < 8) {
|
} else if (bitsPerValue < 8) {
|
||||||
// bitsPerValue is 1, 2 or 4
|
// bitsPerValue is 1, 2 or 4
|
||||||
|
@ -128,15 +139,11 @@ public final class DirectWriter {
|
||||||
// bitsPerValue is 12, 20 or 28
|
// bitsPerValue is 12, 20 or 28
|
||||||
// Write values 2 by 2
|
// Write values 2 by 2
|
||||||
final int numBytesFor2Values = bitsPerValue * 2 / Byte.SIZE;
|
final int numBytesFor2Values = bitsPerValue * 2 / Byte.SIZE;
|
||||||
|
final Setter setter = (bitsPerValue <= Integer.SIZE / 2) ? INT_SETTER : LONG_SETTER;
|
||||||
for (int i = 0, o = 0; i < upTo; i += 2, o += numBytesFor2Values) {
|
for (int i = 0, o = 0; i < upTo; i += 2, o += numBytesFor2Values) {
|
||||||
final long l1 = nextValues[i];
|
final long l1 = nextValues[i];
|
||||||
final long l2 = nextValues[i + 1];
|
final long l2 = nextValues[i + 1];
|
||||||
final long merged = l1 | (l2 << bitsPerValue);
|
setter.set(nextBlocks, o, l1 | (l2 << bitsPerValue));
|
||||||
if (bitsPerValue <= Integer.SIZE / 2) {
|
|
||||||
BitUtil.VH_LE_INT.set(nextBlocks, o, (int) merged);
|
|
||||||
} else {
|
|
||||||
BitUtil.VH_LE_LONG.set(nextBlocks, o, merged);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue