me.lemire.integercompression.differential.IntegratedComposition Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JavaFastPFOR Show documentation
Show all versions of JavaFastPFOR Show documentation
It is a library to compress and uncompress arrays of integers
very fast. The assumption is that most (but not all) values in
your array use less than 32 bits.
/**
* This code is released under the
* Apache License Version 2.0 http://www.apache.org/licenses/.
*
* (c) Daniel Lemire, http://lemire.me/en/
*/
package me.lemire.integercompression.differential;
import me.lemire.integercompression.IntWrapper;
/**
* Helper class to compose schemes.
*
* @author Daniel Lemire
*/
public class IntegratedComposition implements IntegratedIntegerCODEC {
IntegratedIntegerCODEC F1, F2;
/**
* Compose a scheme from a first one (f1) and a second one (f2). The
* first one is called first and then the second one tries to compress
* whatever remains from the first run.
*
* By convention, the first scheme should be such that if, during
* decoding, a 32-bit zero is first encountered, then there is no
* output.
*
* @param f1
* first codec
* @param f2
* second codec
*/
public IntegratedComposition(IntegratedIntegerCODEC f1,
IntegratedIntegerCODEC f2) {
F1 = f1;
F2 = f2;
}
@Override
public void compress(int[] in, IntWrapper inpos, int inlength,
int[] out, IntWrapper outpos) {
if (inlength == 0) {
return;
}
int inposInit = inpos.get();
int outposInit = outpos.get();
F1.compress(in, inpos, inlength, out, outpos);
if (outpos.get() == outposInit) {
out[outposInit] = 0;
outpos.increment();
}
inlength -= inpos.get() - inposInit;
F2.compress(in, inpos, inlength, out, outpos);
}
@Override
public void uncompress(int[] in, IntWrapper inpos, int inlength,
int[] out, IntWrapper outpos) {
if (inlength == 0)
return;
int init = inpos.get();
F1.uncompress(in, inpos, inlength, out, outpos);
inlength -= inpos.get() - init;
F2.uncompress(in, inpos, inlength, out, outpos);
}
@Override
public String toString() {
return F1.toString() + " + " + F2.toString();
}
}