14   enum { BLOCK_MAX_BYTES = 1U << 16, BLOCK_MAX_LEN = BLOCK_MAX_BYTES / 
sizeof(double) };  
    15   enum { COMPRESS_BLOCK_BOUND = (1U << 16) + 3,
    16          DECIMAL_HEADER_MAX_SIZE = 14};
    18   static constexpr uint32_t CommitMaxSize(uint32_t sz) {
    19     return (sz*8 + (sz*8 / 255) + 16) + 3 + DECIMAL_HEADER_MAX_SIZE;
    22   enum {COMMIT_MAX_SIZE = BLOCK_MAX_LEN * 8 + BLOCK_MAX_LEN * 8 / 255 + 16  + 3 +
    23                                    DECIMAL_HEADER_MAX_SIZE };
    29   uint32_t Commit(
const double* src, uint32_t sz, uint8_t* dest);
    33   typedef std::map<int16_t, ExpInfo> ExponentMap;
    35   unsigned NormalizeDecimals(
unsigned count, 
const double* dbl_src);
    36   uint32_t Optimize(
const ExponentMap& em);
    37   uint32_t WriteRawDoubles(
const double* src, uint32_t sz, uint8_t* dest);
    39   struct __attribute__((aligned(4))) Decimal {
    44     bool CanNormalize(
int exp_reference)
 const {
    45       return val == 0 || (dec_len < 17 && exp >= exp_reference &&
    46                           exp - exp_reference <= 17 - dec_len);
    50   struct DecimalHeader {
    53     uint16_t lz4_size, first_exception_index;
    55     void Serialize(uint8_t flags, uint8_t* dest);
    56     uint32_t Parse(uint8_t flags, 
const uint8_t* src);
    60     Decimal dec[BLOCK_MAX_LEN];
    61     double exceptions[BLOCK_MAX_LEN];
    62     int64_t normalized[BLOCK_MAX_LEN];
    67   std::unique_ptr<Aux> aux_;
    73   enum {BLOCK_MAX_LEN = DoubleCompressor::BLOCK_MAX_LEN};
    81   int32_t Decompress(
const uint8_t* src, uint32_t src_len, 
double* dest);
    85   static uint32_t BlockSize(
const uint8_t* header) {
    86     return 3 + ((uint32_t(header[2]) << 8) | header[1]);
    91     uint8_t z4buf[DoubleCompressor::BLOCK_MAX_BYTES];
    92     double exceptions[BLOCK_MAX_LEN];
    95   std::unique_ptr<Aux> aux_;