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_;