feat(compress): move dictionary attachment predicate to Rust
Keep the private CDict and CCtx parameter layouts in C while passing only the five scalar inputs needed by the dictionary-attachment heuristic. Rust now owns the exact per-strategy cutoffs and preserves unknown-size handling, dedicated-search short-circuiting, force-attach and force-copy precedence, and the force-window prohibition. The existing C helper and reset/copy call paths remain unchanged. Test Plan: - `cargo test --manifest-path rust/Cargo.toml --no-default-features --features compression dictionary_attachment` -- passed (2 tests) - `make -B -C lib -j2 lib` -- passed - `make -C tests -j2 fuzzer` -- passed - `./tests/fuzzer -s4560 -t47 -i48 -v` -- passed - Rust clippy for the library, benches, and tests before and after nightly formatting -- passed - `cargo +nightly fmt --manifest-path rust/Cargo.toml` -- passed - `git diff --cached --check` -- passed
This commit is contained in:
@@ -124,6 +124,9 @@ int ZSTD_rust_params_cdictIndicesAreTagged(ZSTD_compressionParameters cParams);
|
||||
int ZSTD_rust_params_dedicatedDictSearchIsSupported(ZSTD_compressionParameters cParams);
|
||||
U32 ZSTD_rust_params_dedicatedDictSearch_getHashLog(U32 hashLog);
|
||||
U32 ZSTD_rust_params_dedicatedDictSearch_revertHashLog(U32 hashLog);
|
||||
int ZSTD_rust_params_shouldAttachDict(int strategy, int dedicatedDictSearch,
|
||||
U64 pledgedSrcSize, int attachDictPref,
|
||||
int forceWindow);
|
||||
|
||||
/* CCtx parameter state is mirrored by rust/src/zstd_compress_params_api.rs.
|
||||
* Rust owns parameter bounds and clamping; C exposes only the
|
||||
@@ -1786,36 +1789,16 @@ void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx) {
|
||||
assert(!ZSTD_window_hasExtDict(cctx->blockState.matchState.window));
|
||||
}
|
||||
|
||||
/* These are the approximate sizes for each strategy past which copying the
|
||||
* dictionary tables into the working context is faster than using them
|
||||
* in-place.
|
||||
*/
|
||||
static const size_t attachDictSizeCutoffs[ZSTD_STRATEGY_MAX+1] = {
|
||||
8 KB, /* unused */
|
||||
8 KB, /* ZSTD_fast */
|
||||
16 KB, /* ZSTD_dfast */
|
||||
32 KB, /* ZSTD_greedy */
|
||||
32 KB, /* ZSTD_lazy */
|
||||
32 KB, /* ZSTD_lazy2 */
|
||||
32 KB, /* ZSTD_btlazy2 */
|
||||
32 KB, /* ZSTD_btopt */
|
||||
8 KB, /* ZSTD_btultra */
|
||||
8 KB /* ZSTD_btultra2 */
|
||||
};
|
||||
|
||||
static int ZSTD_shouldAttachDict(const ZSTD_CDict* cdict,
|
||||
const ZSTD_CCtx_params* params,
|
||||
U64 pledgedSrcSize)
|
||||
{
|
||||
size_t cutoff = attachDictSizeCutoffs[cdict->matchState.cParams.strategy];
|
||||
int const dedicatedDictSearch = cdict->matchState.dedicatedDictSearch;
|
||||
return dedicatedDictSearch
|
||||
|| ( ( pledgedSrcSize <= cutoff
|
||||
|| pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN
|
||||
|| params->attachDictPref == ZSTD_dictForceAttach )
|
||||
&& params->attachDictPref != ZSTD_dictForceCopy
|
||||
&& !params->forceWindow ); /* dictMatchState isn't correctly
|
||||
* handled in _enforceMaxDist */
|
||||
return ZSTD_rust_params_shouldAttachDict(
|
||||
cdict->matchState.cParams.strategy,
|
||||
cdict->matchState.dedicatedDictSearch,
|
||||
pledgedSrcSize,
|
||||
(int)params->attachDictPref,
|
||||
params->forceWindow);
|
||||
}
|
||||
|
||||
static size_t
|
||||
|
||||
Reference in New Issue
Block a user