sclass CompressorSearch {
// public
CompressionRegime regime;
byte[] inputData;
new Best best;
*(CompressionRegime *regime) {}
*(CompressionRegime *regime, byte[] *inputData) {}
// can submit concurrently!
Submission submit(A compression) { _submit(compression); }
// private (although Submission is returned)
class Submission {
void setDecompressor(A decompressor) {
this.decompressor_cache = decompressor;
}
simplyCached byte[] compressed() {
ret decompressor_cache == null ?: regime.decompressorToBytes(decompressor_cache);
}
simplyCached A decompressor() {
ret compressed_cache == null ?: regime.decompressorFromBytes(compressed_cache);
}
int compressedSize() { ret l(compressed()); }
simplyCached double score() {
ret doubleRatio(inputDataSize(), compressedSize());
}
simplyCached Bool correct() {
ret byteArraysEqual(regime.runDecompressorToBytes(decompressor()), inputData);
}
}
int inputDataSize() { ret l(inputData); }
Submission _submit(A compression) {
if (compression == null) ret;
new Submission s;
s.setDecompressor(compression);
if (s.score() > best.score())
if (!s.correct())
warn("Compressor didn't verify");
else
best.put(s, s.score());
ret s;
}
}