feat(compress): move CDict query leaves into Rust

Move CDict compression-parameter and dictionary-ID snapshot reads behind a
Rust-owned projection while retaining the private C field access and the
existing non-null assertion for ZSTD_getCParamsFromCDict. Preserve the public
NULL dictionary-ID result and ABI-compatible compression-parameter return.

Test Plan:
- cargo test --manifest-path rust/Cargo.toml --lib
- cargo clippy --manifest-path rust/Cargo.toml --all-targets -- -D warnings
- make -B -C programs -j1 zstd
- make -C tests -j1 test-zstream ZSTREAM_TESTTIME=-T1s
- focused cdict_query_projection unit tests
This commit is contained in:
2026-07-19 14:26:34 +02:00
parent 993fd0acbe
commit 724c7c60fa
2 changed files with 104 additions and 3 deletions
+21 -3
View File
@@ -1277,6 +1277,19 @@ typedef char ZSTD_rust_compress_begin_using_cdict_state_layout[
&& sizeof(ZSTD_rust_compressBeginUsingCDictState)
== 12 * sizeof(void*))
? 1 : -1];
typedef struct {
const ZSTD_compressionParameters* cParams;
const unsigned* dictID;
} ZSTD_rust_cdictQueryState;
ZSTD_compressionParameters ZSTD_rust_getCParamsFromCDict(
const ZSTD_rust_cdictQueryState* state);
unsigned ZSTD_rust_getDictIDFromCDict(
const ZSTD_rust_cdictQueryState* state);
typedef char ZSTD_rust_cdict_query_state_layout[
(offsetof(ZSTD_rust_cdictQueryState, cParams) == 0
&& offsetof(ZSTD_rust_cdictQueryState, dictID) == sizeof(void*)
&& sizeof(ZSTD_rust_cdictQueryState) == 2 * sizeof(void*))
? 1 : -1];
size_t ZSTD_rust_transferSequencesWBlockDelim(
SeqStore_t* seqStore, ZSTD_SequencePosition* seqPos,
const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
@@ -4939,8 +4952,11 @@ const ZSTD_CDict* ZSTD_initStaticCDict(
ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict)
{
ZSTD_rust_cdictQueryState state;
assert(cdict != NULL);
return cdict->matchState.cParams;
state.cParams = &cdict->matchState.cParams;
state.dictID = NULL;
return ZSTD_rust_getCParamsFromCDict(&state);
}
/*! ZSTD_getDictID_fromCDict() :
@@ -4949,8 +4965,10 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict)
* Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict)
{
if (cdict==NULL) return 0;
return cdict->dictID;
ZSTD_rust_cdictQueryState state;
state.cParams = NULL;
state.dictID = cdict == NULL ? NULL : &cdict->dictID;
return ZSTD_rust_getDictIDFromCDict(&state);
}
static void ZSTD_rust_compressBeginUsingCDict_initParams(