package me.lemire.integercompression; import com.kamikaze.pfordelta.PForDelta; /** * IntegerCODEC wrapper for Kamikaze's PForDelta. * * Note: this class is only included for speed benchmarks. * It is not recommended. Use at your own risks. * * @author Matteo Catena * */ public class Kamikaze implements SkippableIntegerCODEC, IntegerCODEC { private int BLOCK_SIZE = 128; @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength > 0) { int[] out2 = PForDelta.compressOneBlockOpt(in, inlength); inpos.add(inlength); System.arraycopy(out2, 0, out, outpos.get(), out2.length); outpos.add(out2.length); } } @Override public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { num = Util.greatestMultiple(num, BLOCK_SIZE); if (num > 0) { int d = PForDelta.decompressOneBlock(out, in, num); inpos.add(d / 32); outpos.add(num); } } @Override public String toString() { return "Kamikaze's PForDelta"; } @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; outpos.increment(); headlessCompress(in, inpos, inlength, out, outpos); } @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { if (inlength == 0) return; final int outlength = in[inpos.get()]; inpos.increment(); headlessUncompress(in, inpos, inlength, out, outpos, outlength); } }