Skip to content

Commit 0882961

Browse files
committed
implement storing the previously used fse table
1 parent 718f09f commit 0882961

File tree

1 file changed

+47
-50
lines changed

1 file changed

+47
-50
lines changed

src/encoding/blocks/compressed.rs

Lines changed: 47 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -51,60 +51,66 @@ pub fn compress_block<M: Matcher>(state: &mut CompressState<M>, output: &mut Vec
5151

5252
// Choose the tables
5353
// TODO store previously used tables
54-
let (ll_mode, ll_table) = choose_table(
54+
let ll_mode = choose_table(
5555
state.fse_tables.ll_previous.as_ref(),
5656
&state.fse_tables.ll_default,
5757
sequences.iter().map(|seq| encode_literal_length(seq.ll).0),
5858
9,
5959
);
60-
let (ml_mode, ml_table) = choose_table(
60+
let ml_mode = choose_table(
6161
state.fse_tables.ml_previous.as_ref(),
6262
&state.fse_tables.ml_default,
6363
sequences.iter().map(|seq| encode_match_len(seq.ml).0),
6464
9,
6565
);
66-
let (of_mode, of_table) = choose_table(
66+
let of_mode = choose_table(
6767
state.fse_tables.of_previous.as_ref(),
6868
&state.fse_tables.of_default,
6969
sequences.iter().map(|seq| encode_offset(seq.of).0),
7070
8,
7171
);
7272

73-
writer.write_bits(encode_fse_table_modes(ll_mode, ml_mode, of_mode), 8);
73+
writer.write_bits(encode_fse_table_modes(&ll_mode, &ml_mode, &of_mode), 8);
7474

75-
encode_table(ll_mode, ll_table.as_ref(), &mut writer);
76-
encode_table(of_mode, of_table.as_ref(), &mut writer);
77-
encode_table(ml_mode, ml_table.as_ref(), &mut writer);
75+
encode_table(&ll_mode, &mut writer);
76+
encode_table(&of_mode, &mut writer);
77+
encode_table(&ml_mode, &mut writer);
7878

7979
encode_sequences(
8080
&sequences,
8181
&mut writer,
82-
ll_table.as_ref(),
83-
ml_table.as_ref(),
84-
of_table.as_ref(),
82+
ll_mode.as_ref(),
83+
ml_mode.as_ref(),
84+
of_mode.as_ref(),
8585
);
86+
87+
if let FseTableMode::Encoded(table) = ll_mode {
88+
state.fse_tables.ll_previous = Some(table)
89+
}
90+
if let FseTableMode::Encoded(table) = ml_mode {
91+
state.fse_tables.ml_previous = Some(table)
92+
}
93+
if let FseTableMode::Encoded(table) = of_mode {
94+
state.fse_tables.of_previous = Some(table)
95+
}
8696
}
8797
writer.flush();
8898
}
8999

90-
#[derive(Copy, Clone)]
91-
enum FseTableMode {
92-
Predefined,
93-
Encoded,
94-
RepeateLast,
95-
}
96-
97-
/// Can't use std::borrow::Cow in no_std because it isn't in core
98-
enum MaybeOwned<'a, T> {
99-
Borrowed(&'a T),
100-
Owned(T),
100+
#[derive(Clone)]
101+
#[allow(clippy::large_enum_variant)]
102+
enum FseTableMode<'a> {
103+
Predefined(&'a FSETable),
104+
Encoded(FSETable),
105+
RepeateLast(&'a FSETable),
101106
}
102107

103-
impl<T> MaybeOwned<'_, T> {
104-
pub fn as_ref(&self) -> &T {
105-
match *self {
106-
Self::Borrowed(borrowed) => borrowed,
107-
Self::Owned(ref owned) => owned,
108+
impl FseTableMode<'_> {
109+
pub fn as_ref(&self) -> &FSETable {
110+
match self {
111+
Self::Predefined(t) => t,
112+
Self::RepeateLast(t) => t,
113+
Self::Encoded(t) => t,
108114
}
109115
}
110116
}
@@ -114,46 +120,37 @@ fn choose_table<'a>(
114120
default_table: &'a FSETable,
115121
data: impl Iterator<Item = u8>,
116122
max_log: u8,
117-
) -> (FseTableMode, MaybeOwned<'a, FSETable>) {
123+
) -> FseTableMode<'a> {
118124
// TODO check if the new table is better than the predefined and previous table
119125
let use_new_table = false;
120126
let use_previous_table = false;
121127
if use_previous_table {
122-
(
123-
FseTableMode::RepeateLast,
124-
MaybeOwned::Borrowed(previous.unwrap()),
125-
)
128+
FseTableMode::RepeateLast(previous.unwrap())
126129
} else if use_new_table {
127-
(
128-
FseTableMode::Encoded,
129-
MaybeOwned::Owned(build_table_from_data(data, max_log, true)),
130-
)
130+
FseTableMode::Encoded(build_table_from_data(data, max_log, true))
131131
} else {
132-
(
133-
FseTableMode::Predefined,
134-
MaybeOwned::Borrowed(default_table),
135-
)
132+
FseTableMode::Predefined(default_table)
136133
}
137134
}
138135

139-
fn encode_table(mode: FseTableMode, table: &FSETable, writer: &mut BitWriter<&mut Vec<u8>>) {
136+
fn encode_table(mode: &FseTableMode<'_>, writer: &mut BitWriter<&mut Vec<u8>>) {
140137
match mode {
141-
FseTableMode::Predefined => {}
142-
FseTableMode::RepeateLast => {}
143-
FseTableMode::Encoded => table.write_table(writer),
138+
FseTableMode::Predefined(_) => {}
139+
FseTableMode::RepeateLast(_) => {}
140+
FseTableMode::Encoded(table) => table.write_table(writer),
144141
}
145142
}
146143

147144
fn encode_fse_table_modes(
148-
ll_mode: FseTableMode,
149-
ml_mode: FseTableMode,
150-
of_mode: FseTableMode,
145+
ll_mode: &FseTableMode<'_>,
146+
ml_mode: &FseTableMode<'_>,
147+
of_mode: &FseTableMode<'_>,
151148
) -> u8 {
152-
fn mode_to_bits(mode: FseTableMode) -> u8 {
149+
fn mode_to_bits(mode: &FseTableMode<'_>) -> u8 {
153150
match mode {
154-
FseTableMode::Predefined => 0,
155-
FseTableMode::Encoded => 2,
156-
FseTableMode::RepeateLast => 3,
151+
FseTableMode::Predefined(_) => 0,
152+
FseTableMode::Encoded(_) => 2,
153+
FseTableMode::RepeateLast(_) => 3,
157154
}
158155
}
159156
mode_to_bits(ll_mode) << 6 | mode_to_bits(of_mode) << 4 | mode_to_bits(ml_mode) << 2

0 commit comments

Comments
 (0)