refactor(dict): move CDict size policy to Rust

Keep the advanced CDict estimator and its private workspace sizing inputs in C, but route the public estimate through a Rust policy bridge. Rust now selects unknown-source/create-CDict parameters and the public by-copy load mode before invoking the opaque C estimator. Focused tests verify callback ordering, selected parameters, and the missing-policy-input guard.

Test Plan: Not run in this atomic commit; the capped serial Rust, native, smoke, and original test-suite verification follows.
This commit is contained in:
2026-07-21 07:38:34 +02:00
parent 8373de7917
commit f1dcd68d5d
2 changed files with 179 additions and 4 deletions
+34 -2
View File
@@ -1751,6 +1751,25 @@ typedef char ZSTD_rust_next_input_size_hint_mt_or_st_state_layout[
? 1 : -1];
size_t ZSTD_rust_nextInputSizeHintMTorST(
const ZSTD_rust_nextInputSizeHintMTorSTState* state);
typedef size_t (*ZSTD_rust_estimateCDictSizeAdvanced_f)(
void* context, size_t dictSize, ZSTD_compressionParameters cParams,
int dictLoadMethod);
typedef struct {
void* callbackContext;
const U32* exclusionMask;
ZSTD_rust_estimateCDictSizeAdvanced_f estimateAdvanced;
} ZSTD_rust_estimateCDictSizeState;
typedef char zstd_rust_estimate_cdict_size_state_layout[
(offsetof(ZSTD_rust_estimateCDictSizeState, callbackContext) == 0
&& offsetof(ZSTD_rust_estimateCDictSizeState, exclusionMask)
== sizeof(void*)
&& offsetof(ZSTD_rust_estimateCDictSizeState, estimateAdvanced)
== 2 * sizeof(void*)
&& sizeof(ZSTD_rust_estimateCDictSizeState) == 3 * sizeof(void*))
? 1 : -1];
size_t ZSTD_rust_estimateCDictSize(
const ZSTD_rust_estimateCDictSizeState* state,
size_t dictSize, int compressionLevel);
size_t ZSTD_rust_sizeofCDict(size_t objectSize, size_t workspaceSize);
size_t ZSTD_rust_sizeofLocalDict(int dictBufferPresent, size_t dictSize,
size_t cdictSize);
@@ -7104,10 +7123,23 @@ size_t ZSTD_estimateCDictSize_advanced(
dictSize, cParams, (int)dictLoadMethod, &sizing);
}
static size_t ZSTD_rust_estimateCDictSize_advanced(
void* context, size_t dictSize, ZSTD_compressionParameters cParams,
int dictLoadMethod)
{
(void)context;
return ZSTD_estimateCDictSize_advanced(
dictSize, cParams, (ZSTD_dictLoadMethod_e)dictLoadMethod);
}
size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel)
{
ZSTD_compressionParameters const cParams = ZSTD_getCParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict);
return ZSTD_estimateCDictSize_advanced(dictSize, cParams, ZSTD_dlm_byCopy);
ZSTD_rust_estimateCDictSizeState state;
U32 const exclusionMask = ZSTD_getCParamsExclusionMask();
state.callbackContext = NULL;
state.exclusionMask = &exclusionMask;
state.estimateAdvanced = ZSTD_rust_estimateCDictSize_advanced;
return ZSTD_rust_estimateCDictSize(&state, dictSize, compressionLevel);
}
size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict)