success = decompressImpl<8, true>(source, dest, source_size, dest_size);
        if (best_variant == 3)
            success = decompressImpl<32, false>(source, dest, source_size, dest_size);
        if (best_variant == 4)
            success = decompressImpl<32, true>(source, dest, source_size, dest_size);
        watch.stop();
        
        statistics.data[best_variant].update(watch.elapsedSeconds(), dest_size);
        return success;
    }
    else
    {
        return decompressImpl<8, false>(source, dest, source_size, dest_size);
    }
}
void StreamStatistics::literal(size_t length)
{
    ++num_tokens;
    sum_literal_lengths += length;
}
void StreamStatistics::match(size_t length, size_t offset)
{
    ++num_tokens;
    sum_match_lengths += length;
    sum_match_offsets += offset;
    count_match_offset_less_8 += offset < 8;
    count_match_offset_less_16 += offset < 16;
    count_match_replicate_itself += offset < length;
}
void StreamStatistics::print() const