Skip to content

Commit 4f6155a

Browse files
committed
Use const generics for FSEv07_DState_t
1 parent 6b24499 commit 4f6155a

File tree

1 file changed

+31
-49
lines changed

1 file changed

+31
-49
lines changed

lib/legacy/zstd_v07.rs

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub(crate) struct ZSTDv07_DCtx {
3232
vBase: *const core::ffi::c_void,
3333
dictEnd: *const core::ffi::c_void,
3434
expected: usize,
35-
rep: [u32; 3],
35+
rep: [u32; ZSTDv07_REP_INIT],
3636
fParams: ZSTDv07_frameParams,
3737
bType: blockType_t,
3838
stage: ZSTDv07_dStage,
@@ -80,16 +80,16 @@ struct blockProperties_t {
8080
#[repr(C)]
8181
struct seqState_t<'a> {
8282
DStream: BITv07_DStream_t<'a>,
83-
stateLL: FSEv07_DState_t<'a>,
84-
stateOffb: FSEv07_DState_t<'a>,
85-
stateML: FSEv07_DState_t<'a>,
86-
prevOffset: [usize; 3],
83+
stateLL: FSEv07_DState_t<'a, 512>,
84+
stateOffb: FSEv07_DState_t<'a, 256>,
85+
stateML: FSEv07_DState_t<'a, 512>,
86+
prevOffset: [usize; ZSTDv07_REP_INIT],
8787
}
8888
#[derive(Copy, Clone)]
8989
#[repr(C)]
90-
struct FSEv07_DState_t<'a> {
90+
struct FSEv07_DState_t<'a, const N: usize> {
9191
state: usize,
92-
table: &'a [FSEv07_decode_t],
92+
table: &'a [FSEv07_decode_t; N],
9393
}
9494
#[derive(Copy, Clone)]
9595
#[repr(C)]
@@ -344,7 +344,7 @@ impl<'a> BITv07_DStream_t<'a> {
344344
fn FSEv07_initDState<'a, const N: usize>(
345345
bitD: &mut BITv07_DStream_t,
346346
dt: &'a FSEv07_DTable<N>,
347-
) -> FSEv07_DState_t<'a> {
347+
) -> FSEv07_DState_t<'a, N> {
348348
let state = bitD.read_bits(dt.header.tableLog as core::ffi::c_uint);
349349
bitD.reload();
350350
FSEv07_DState_t {
@@ -353,20 +353,23 @@ fn FSEv07_initDState<'a, const N: usize>(
353353
}
354354
}
355355
#[inline]
356-
unsafe fn FSEv07_peekSymbol(DStatePtr: &FSEv07_DState_t) -> u8 {
356+
unsafe fn FSEv07_peekSymbol<const N: usize>(DStatePtr: &FSEv07_DState_t<N>) -> u8 {
357357
let DInfo = DStatePtr.table[DStatePtr.state];
358358
DInfo.symbol
359359
}
360360
#[inline]
361-
unsafe fn FSEv07_updateState(DStatePtr: &mut FSEv07_DState_t, bitD: &mut BITv07_DStream_t) {
361+
unsafe fn FSEv07_updateState<const N: usize>(
362+
DStatePtr: &mut FSEv07_DState_t<N>,
363+
bitD: &mut BITv07_DStream_t,
364+
) {
362365
let DInfo = DStatePtr.table[DStatePtr.state];
363366
let nbBits = DInfo.nbBits as u32;
364367
let lowBits = bitD.read_bits(nbBits);
365368
DStatePtr.state = (DInfo.newState as usize).wrapping_add(lowBits);
366369
}
367370
#[inline]
368-
unsafe fn FSEv07_decodeSymbol(
369-
DStatePtr: &mut FSEv07_DState_t,
371+
unsafe fn FSEv07_decodeSymbol<const N: usize>(
372+
DStatePtr: &mut FSEv07_DState_t<N>,
370373
bitD: &mut BITv07_DStream_t,
371374
) -> core::ffi::c_uchar {
372375
let DInfo = DStatePtr.table[DStatePtr.state];
@@ -377,8 +380,8 @@ unsafe fn FSEv07_decodeSymbol(
377380
symbol
378381
}
379382
#[inline]
380-
unsafe fn FSEv07_decodeSymbolFast(
381-
DStatePtr: &mut FSEv07_DState_t,
383+
unsafe fn FSEv07_decodeSymbolFast<const N: usize>(
384+
DStatePtr: &mut FSEv07_DState_t<N>,
382385
bitD: &mut BITv07_DStream_t,
383386
) -> core::ffi::c_uchar {
384387
let DInfo = DStatePtr.table[DStatePtr.state];
@@ -2038,7 +2041,7 @@ unsafe fn ZSTDv07_defaultFreeFunction(
20382041
}
20392042
const ZSTDv07_DICT_MAGIC: core::ffi::c_uint = 0xec30a437 as core::ffi::c_uint;
20402043
const ZSTDv07_REP_NUM: core::ffi::c_int = 3;
2041-
const ZSTDv07_REP_INIT: core::ffi::c_int = 3;
2044+
const ZSTDv07_REP_INIT: usize = 3;
20422045
static repStartValue: [u32; 3] = [1, 4, 8];
20432046
const ZSTDv07_WINDOWLOG_ABSOLUTEMIN: core::ffi::c_int = 10;
20442047
static ZSTDv07_fcs_fieldSize: [usize; 4] = [0, 2, 4, 8];
@@ -2904,46 +2907,25 @@ unsafe fn ZSTDv07_decompressSequences(
29042907
)?;
29052908
ip = ip.add(seqHSize);
29062909
if nbSeq != 0 {
2907-
let mut seqState = seqState_t {
2908-
DStream: BITv07_DStream_t {
2909-
bitContainer: 0,
2910-
bitsConsumed: 0,
2911-
ptr: core::ptr::null(),
2912-
start: core::ptr::null(),
2913-
_marker: PhantomData,
2914-
},
2915-
stateLL: FSEv07_DState_t {
2916-
state: 0,
2917-
table: &[],
2918-
},
2919-
stateOffb: FSEv07_DState_t {
2920-
state: 0,
2921-
table: &[],
2922-
},
2923-
stateML: FSEv07_DState_t {
2924-
state: 0,
2925-
table: &[],
2926-
},
2927-
prevOffset: [0; 3],
2928-
};
29292910
(*dctx).fseEntropy = 1;
2930-
let mut i: u32 = 0;
2931-
i = 0;
2932-
while i < ZSTDv07_REP_INIT as u32 {
2933-
*(seqState.prevOffset).as_mut_ptr().offset(i as isize) =
2934-
*((*dctx).rep).as_mut_ptr().offset(i as isize) as usize;
2935-
i = i.wrapping_add(1);
2936-
}
2937-
match BITv07_DStream_t::new(core::slice::from_raw_parts(
2911+
let prevOffset: [usize; ZSTDv07_REP_INIT] =
2912+
core::array::from_fn(|i| (*dctx).rep[i] as usize);
2913+
2914+
let mut DStream = match BITv07_DStream_t::new(core::slice::from_raw_parts(
29382915
ip,
29392916
iend.offset_from(ip) as usize,
29402917
)) {
2941-
Ok(bitD) => seqState.DStream = bitD,
2918+
Ok(DStream) => DStream,
29422919
Err(_) => return Err(Error::corruption_detected),
29432920
};
2944-
seqState.stateLL = FSEv07_initDState(&mut seqState.DStream, DTableLL);
2945-
seqState.stateOffb = FSEv07_initDState(&mut seqState.DStream, DTableOffb);
2946-
seqState.stateML = FSEv07_initDState(&mut seqState.DStream, DTableML);
2921+
let mut seqState = seqState_t {
2922+
stateLL: FSEv07_initDState(&mut DStream, DTableLL),
2923+
stateOffb: FSEv07_initDState(&mut DStream, DTableOffb),
2924+
stateML: FSEv07_initDState(&mut DStream, DTableML),
2925+
DStream,
2926+
prevOffset,
2927+
};
2928+
29472929
while seqState.DStream.reload() as core::ffi::c_uint
29482930
<= BITv07_DStream_completed as core::ffi::c_int as core::ffi::c_uint
29492931
&& nbSeq != 0

0 commit comments

Comments
 (0)