15#define HashRolling HASHER()
17static const uint32_t
FN(kRollingHashMul32) = 69069;
18static const uint32_t
FN(kInvalidPos) = 0xffffffff;
28static uint32_t
FN(HashByte)(uint8_t byte) {
29 return (uint32_t)
byte + 1u;
32static uint32_t
FN(HashRollingFunctionInitial)(uint32_t state, uint8_t add,
34 return (uint32_t)(factor * state +
FN(HashByte)(add));
37static uint32_t
FN(HashRollingFunction)(uint32_t state, uint8_t add,
38 uint8_t rem, uint32_t factor,
39 uint32_t factor_remove) {
40 return (uint32_t)(factor * state +
41 FN(HashByte)(add) - factor_remove *
FN(HashByte)(rem));
54static void FN(Initialize)(
61 self->factor =
FN(kRollingHashMul32);
65 self->factor_remove = 1;
67 self->factor_remove *= self->factor;
70 self->table = (uint32_t*)common->extra;
72 self->table[
i] =
FN(kInvalidPos);
85 self->state =
FN(HashRollingFunctionInitial)(
86 self->state,
data[
i], self->factor);
110 const size_t ix_start,
const size_t ix_end) {
120 size_t num_bytes,
size_t position,
const uint8_t* ringbuffer,
121 size_t ring_buffer_mask) {
124 size_t position_masked;
125 size_t available = num_bytes;
126 if ((position & (
JUMP - 1)) != 0) {
128 available = (
diff > available) ? 0 : (available -
diff);
131 position_masked = position & ring_buffer_mask;
133 if (available > ring_buffer_mask - position_masked) {
134 available = ring_buffer_mask - position_masked;
138 ringbuffer + (position & ring_buffer_mask));
139 self->next_ix = position;
155 const size_t max_length,
const size_t max_backward,
156 const size_t dictionary_distance,
const size_t max_distance,
158 const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
161 if ((cur_ix & (
JUMP - 1)) != 0)
return;
166 for (pos = self->next_ix; pos <= cur_ix; pos +=
JUMP) {
169 uint8_t rem =
data[pos & ring_buffer_mask];
170 uint8_t add =
data[(pos +
CHUNKLEN) & ring_buffer_mask];
171 size_t found_ix =
FN(kInvalidPos);
173 self->state =
FN(HashRollingFunction)(
174 self->state, add, rem, self->factor, self->factor_remove);
177 found_ix = self->table[
code];
178 self->table[
code] = (uint32_t)pos;
179 if (pos == cur_ix && found_ix !=
FN(kInvalidPos)) {
182 size_t backward = (uint32_t)(cur_ix - found_ix);
183 if (backward <= max_backward) {
184 const size_t found_ix_masked = found_ix & ring_buffer_mask;
185 const size_t len = FindMatchLengthWithLimit(&
data[found_ix_masked],
186 &
data[cur_ix_masked],
189 score_t score = BackwardReferenceScore(
len, backward);
190 if (score >
out->score) {
192 out->distance = backward;
194 out->len_code_delta = 0;
202 self->next_ix = cur_ix +
JUMP;
static const void * data
Definition XzCrc64.c:50
static const void size_t const UInt64 * table
Definition XzCrc64.c:50
#define FN(X)
Definition backward_references.c:51
#define NUMBUCKETS
Definition hash.h:332
#define CHUNKLEN
Definition hash.h:330
#define score_t
Definition hash.h:43
#define MASK
Definition hash.h:333
#define JUMP
Definition hash.h:331
#define HashRolling
Definition hash_rolling_inc.h:15
str diff(bytes a, bytes b)
Definition run.py:91
Definition encoder_dict.h:20
Definition hash_rolling_inc.h:44
uint32_t chunk_len
Definition hash_rolling_inc.h:49
size_t next_ix
Definition hash_rolling_inc.h:47
uint32_t factor_remove
Definition hash_rolling_inc.h:51
Definition poolTests.c:28
Definition zstd_decompress.c:306
#define BROTLI_FALSE
Definition types.h:53
#define BROTLI_BOOL
Definition types.h:49
const lzma_allocator const uint8_t size_t uint8_t * out
Definition block.h:528
lzma_index ** i
Definition index.h:629
static uint32_t const uint8_t uint32_t len
Definition memcmplen.h:44
struct dictionary_s dictionary