@@ -161,7 +161,7 @@ enum RleV1EncoderState<N: NInt> {
161
161
/// When buffer is empty and no values to encode.
162
162
Empty ,
163
163
/// Run model with run value and delta
164
- Run { value : N , delta : i8 , count : usize } ,
164
+ Run { value : N , delta : i8 , length : usize } ,
165
165
/// Literal model with values saved in buffer
166
166
Literal { buffer : Vec < N > } ,
167
167
}
@@ -191,18 +191,19 @@ impl<N: NInt, S: EncodingSign> RleV1Encoder<N, S> {
191
191
RleV1EncoderState :: Run {
192
192
value : run_value,
193
193
delta,
194
- count ,
194
+ length ,
195
195
} => {
196
- if run_value. as_i64 ( ) + * delta as i64 * * count as i64 == value. as_i64 ( ) {
196
+ if run_value. as_i64 ( ) + * delta as i64 * * length as i64 == value. as_i64 ( ) {
197
197
// keep run model
198
- * count += 1 ;
199
- if * count == MAX_RUN_LENGTH {
198
+ * length += 1 ;
199
+ if * length == MAX_RUN_LENGTH {
200
200
// reach run limit
201
- write_run :: < _ , S > ( & mut self . writer , value, * delta, * count) ;
201
+ write_run :: < _ , S > ( & mut self . writer , * run_value, * delta, * length) ;
202
+ self . state = RleV1EncoderState :: Empty ;
202
203
}
203
204
} else {
204
205
// write run values and change to literal model
205
- write_run :: < _ , S > ( & mut self . writer , value , * delta, * count ) ;
206
+ write_run :: < _ , S > ( & mut self . writer , * run_value , * delta, * length ) ;
206
207
// TODO: avoid new vec
207
208
let mut buffer = Vec :: with_capacity ( MAX_LITERAL_LENGTH ) ;
208
209
buffer. push ( value) ;
@@ -211,24 +212,24 @@ impl<N: NInt, S: EncodingSign> RleV1Encoder<N, S> {
211
212
}
212
213
RleV1EncoderState :: Literal { buffer } => {
213
214
buffer. push ( value) ;
214
- let count = buffer. len ( ) ;
215
- let delta = ( value - buffer[ count - 2 ] ) . as_i64 ( ) ;
215
+ let length = buffer. len ( ) ;
216
+ let delta = ( value - buffer[ length - 2 ] ) . as_i64 ( ) ;
216
217
// check if can change to run model
217
- if count >= MIN_RUN_LENGTH
218
+ if length >= MIN_RUN_LENGTH
218
219
&& ( MIN_DELTA ..=MAX_DELTA ) . contains ( & delta)
219
- && delta == ( buffer[ count - 2 ] - buffer[ count - 3 ] ) . as_i64 ( )
220
+ && delta == ( buffer[ length - 2 ] - buffer[ length - 3 ] ) . as_i64 ( )
220
221
{
221
222
// change to run model
222
- if count > MIN_RUN_LENGTH {
223
+ if length > MIN_RUN_LENGTH {
223
224
// write the left literals
224
- write_literals :: < _ , S > ( & mut self . writer , buffer, count - MIN_RUN_LENGTH ) ;
225
+ write_literals :: < _ , S > ( & mut self . writer , buffer, length - MIN_RUN_LENGTH ) ;
225
226
}
226
227
self . state = RleV1EncoderState :: Run {
227
- value : buffer[ count - MIN_RUN_LENGTH ] ,
228
+ value : buffer[ length - MIN_RUN_LENGTH ] ,
228
229
delta : delta as i8 ,
229
- count : MIN_RUN_LENGTH ,
230
+ length : MIN_RUN_LENGTH ,
230
231
}
231
- } else if count == MAX_LITERAL_LENGTH {
232
+ } else if length == MAX_LITERAL_LENGTH {
232
233
// reach buffer limit, write literals and change to empty state
233
234
write_literals :: < _ , S > ( & mut self . writer , buffer, MAX_LITERAL_LENGTH ) ;
234
235
self . state = RleV1EncoderState :: Empty ;
@@ -245,9 +246,9 @@ impl<N: NInt, S: EncodingSign> RleV1Encoder<N, S> {
245
246
RleV1EncoderState :: Run {
246
247
value,
247
248
delta,
248
- count ,
249
+ length ,
249
250
} => {
250
- write_run :: < _ , S > ( & mut self . writer , value, delta, count ) ;
251
+ write_run :: < _ , S > ( & mut self . writer , value, delta, length ) ;
251
252
}
252
253
RleV1EncoderState :: Literal { buffer } => {
253
254
write_literals :: < _ , S > ( & mut self . writer , & buffer, buffer. len ( ) ) ;
@@ -328,6 +329,14 @@ mod tests {
328
329
let original = ( 1 ..=100 ) . rev ( ) . collect :: < Vec < _ > > ( ) ;
329
330
let encoded = [ 0x61 , 0xff , 0x64 ] ;
330
331
test_helper ( & original, & encoded) ;
332
+
333
+ let original = ( 1 ..=150 ) . rev ( ) . collect :: < Vec < _ > > ( ) ;
334
+ let encoded = [ 0x7f , 0xff , 0x96 , 0x01 , 0x11 , 0xff , 0x14 ] ;
335
+ test_helper ( & original, & encoded) ;
336
+
337
+ let original = [ 2 , 4 , 6 , 8 , 1 , 3 , 5 , 7 , 255 ] ;
338
+ let encoded = [ 0x01 , 0x02 , 0x02 , 0x01 , 0x02 , 0x01 , 0xff , 0xff , 0x01 ] ;
339
+ test_helper ( & original, & encoded) ;
331
340
Ok ( ( ) )
332
341
}
333
342
0 commit comments