@@ -89,6 +89,19 @@ impl Lz4Encoder {
89
89
self . block_buffer_size
90
90
}
91
91
92
+ fn drain_buffer (
93
+ & mut self ,
94
+ output : & mut PartialBuffer < impl AsRef < [ u8 ] > + AsMut < [ u8 ] > > ,
95
+ ) -> ( usize , usize ) {
96
+ match self . maybe_buffer . as_mut ( ) {
97
+ Some ( buffer) => {
98
+ let drained_bytes = output. copy_unwritten_from ( buffer) ;
99
+ ( drained_bytes, buffer. unwritten ( ) . len ( ) )
100
+ }
101
+ None => ( 0 , 0 ) ,
102
+ }
103
+ }
104
+
92
105
fn write < ' a , T > (
93
106
& ' a mut self ,
94
107
lz4_fn : Lz4Fn < ' a , T > ,
@@ -97,6 +110,11 @@ impl Lz4Encoder {
97
110
where
98
111
T : AsRef < [ u8 ] > ,
99
112
{
113
+ let ( drained_before, undrained) = self . drain_buffer ( output) ;
114
+ if undrained > 0 {
115
+ return Ok ( drained_before) ;
116
+ }
117
+
100
118
let min_dst_size = match & lz4_fn {
101
119
Lz4Fn :: Begin => LZ4F_HEADER_SIZE_MAX ,
102
120
Lz4Fn :: Update { input } => {
@@ -169,8 +187,9 @@ impl Lz4Encoder {
169
187
}
170
188
} ;
171
189
172
- if direct_output {
190
+ let drained_after = if direct_output {
173
191
output. advance ( len) ;
192
+ len
174
193
} else {
175
194
// SAFETY: buffer is initialized above incase of a non-direct operation
176
195
unsafe {
@@ -180,9 +199,11 @@ impl Lz4Encoder {
180
199
. get_mut ( )
181
200
. set_len ( len) ;
182
201
}
183
- }
202
+ let ( d, _) = self . drain_buffer ( output) ;
203
+ d
204
+ } ;
184
205
185
- Ok ( len )
206
+ Ok ( drained_before + drained_after )
186
207
}
187
208
}
188
209
@@ -199,18 +220,7 @@ impl Encode for Lz4Encoder {
199
220
}
200
221
201
222
State :: Encoding => {
202
- if let Some ( buffer) = self . maybe_buffer . as_mut ( ) {
203
- output. copy_unwritten_from ( buffer) ;
204
- }
205
-
206
- // start another round of compression if buffer is fully drained or None
207
- if self
208
- . maybe_buffer
209
- . as_ref ( )
210
- . is_none_or ( |buffer| buffer. unwritten ( ) . is_empty ( ) )
211
- {
212
- self . write ( Lz4Fn :: Update { input } , output) ?;
213
- }
223
+ self . write ( Lz4Fn :: Update { input } , output) ?;
214
224
}
215
225
216
226
State :: Footer | State :: Done => {
@@ -236,32 +246,13 @@ impl Encode for Lz4Encoder {
236
246
}
237
247
238
248
State :: Encoding => {
239
- if let Some ( buffer) = self . maybe_buffer . as_mut ( ) {
240
- output. copy_unwritten_from ( buffer) ;
241
- }
242
-
243
- if self
244
- . maybe_buffer
245
- . as_ref ( )
246
- . is_none_or ( |buffer| buffer. unwritten ( ) . is_empty ( ) )
247
- {
248
- let len = self . write ( Lz4Fn :: Flush :: < & [ u8 ] > , output) ?;
249
- len == 0
250
- } else {
251
- false
252
- }
249
+ let len = self . write ( Lz4Fn :: Flush :: < & [ u8 ] > , output) ?;
250
+ len == 0
253
251
}
254
252
255
253
State :: Footer => {
256
- if let Some ( buffer) = self . maybe_buffer . as_mut ( ) {
257
- output. copy_unwritten_from ( buffer) ;
258
- }
259
-
260
- if self
261
- . maybe_buffer
262
- . as_ref ( )
263
- . is_none_or ( |buffer| buffer. unwritten ( ) . is_empty ( ) )
264
- {
254
+ let ( _, undrained) = self . drain_buffer ( output) ;
255
+ if undrained == 0 {
265
256
self . state = State :: Done ;
266
257
true
267
258
} else {
@@ -293,29 +284,12 @@ impl Encode for Lz4Encoder {
293
284
}
294
285
295
286
State :: Encoding => {
296
- if let Some ( buffer) = self . maybe_buffer . as_mut ( ) {
297
- output. copy_unwritten_from ( buffer) ;
298
- }
299
-
300
- if self
301
- . maybe_buffer
302
- . as_ref ( )
303
- . is_none_or ( |buffer| buffer. unwritten ( ) . is_empty ( ) )
304
- {
305
- self . write ( Lz4Fn :: End :: < & [ u8 ] > , output) ?;
306
- }
287
+ self . write ( Lz4Fn :: End :: < & [ u8 ] > , output) ?;
307
288
}
308
289
309
290
State :: Footer => {
310
- if let Some ( buffer) = self . maybe_buffer . as_mut ( ) {
311
- output. copy_unwritten_from ( buffer) ;
312
- }
313
-
314
- if self
315
- . maybe_buffer
316
- . as_ref ( )
317
- . is_none_or ( |buffer| buffer. unwritten ( ) . is_empty ( ) )
318
- {
291
+ let ( _, undrained) = self . drain_buffer ( output) ;
292
+ if undrained == 0 {
319
293
self . state = State :: Done ;
320
294
}
321
295
}
0 commit comments