@@ -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
147144fn 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