45 lines
1.3 KiB
Java
45 lines
1.3 KiB
Java
package org.warp.jcwdb;
|
|
|
|
import it.unimi.dsi.fastutil.ints.IntArrayList;
|
|
import it.unimi.dsi.fastutil.longs.LongArrayList;
|
|
|
|
public class DBLightBigListParser<T> extends DBTypeParserImpl<LightBigList<T>> {
|
|
private final JCWDatabase db;
|
|
|
|
public DBLightBigListParser(JCWDatabase db) {
|
|
this.db = db;
|
|
}
|
|
|
|
public DBReader<LightBigList<T>> getReader() {
|
|
return (i, size) -> {
|
|
LongArrayList chunks = new LongArrayList();
|
|
IntArrayList chunkSizes = new IntArrayList();
|
|
long max = size / (Long.BYTES + Integer.BYTES);
|
|
for (int item = 0; item < max; item++) {
|
|
long itm = i.readLong();
|
|
int itm2 = i.readInt();
|
|
chunks.add(itm);
|
|
chunkSizes.add(itm2);
|
|
}
|
|
return new LightBigList<>(db, chunks, chunkSizes);
|
|
};
|
|
}
|
|
|
|
public DBDataOutput<LightBigList<T>> getWriter(final LightBigList<T> value) {
|
|
final int elementsCount = value.chunksCount();
|
|
return DBDataOutput.create((o) -> {
|
|
LongArrayList list = value.chunks;
|
|
IntArrayList list2 = value.chunkSizes;
|
|
for (int i = 0; i < elementsCount; i++) {
|
|
o.writeLong(list.getLong(i));
|
|
o.writeInt(list2.getInt(i));
|
|
}
|
|
}, DBStandardTypes.LIGHT_LIST_BIG, elementsCount * (Long.BYTES + Integer.BYTES), calculateHash(value));
|
|
}
|
|
|
|
@Override
|
|
public long calculateHash(LightBigList<T> value) {
|
|
return (((long)value.chunks.hashCode()) << 32) | (value.chunkSizes.hashCode() & 0xffffffffL);
|
|
}
|
|
}
|