Skip to content

Commit f3f724e

Browse files
committed
fix and add more test
1 parent 9e12fef commit f3f724e

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

src/encoding/integer/rle_v1.rs

+27-18
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ enum RleV1EncoderState<N: NInt> {
161161
/// When buffer is empty and no values to encode.
162162
Empty,
163163
/// Run model with run value and delta
164-
Run { value: N, delta: i8, count: usize },
164+
Run { value: N, delta: i8, length: usize },
165165
/// Literal model with values saved in buffer
166166
Literal { buffer: Vec<N> },
167167
}
@@ -191,18 +191,19 @@ impl<N: NInt, S: EncodingSign> RleV1Encoder<N, S> {
191191
RleV1EncoderState::Run {
192192
value: run_value,
193193
delta,
194-
count,
194+
length,
195195
} => {
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() {
197197
// keep run model
198-
*count += 1;
199-
if *count == MAX_RUN_LENGTH {
198+
*length += 1;
199+
if *length == MAX_RUN_LENGTH {
200200
// 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;
202203
}
203204
} else {
204205
// 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);
206207
// TODO: avoid new vec
207208
let mut buffer = Vec::with_capacity(MAX_LITERAL_LENGTH);
208209
buffer.push(value);
@@ -211,24 +212,24 @@ impl<N: NInt, S: EncodingSign> RleV1Encoder<N, S> {
211212
}
212213
RleV1EncoderState::Literal { buffer } => {
213214
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();
216217
// check if can change to run model
217-
if count >= MIN_RUN_LENGTH
218+
if length >= MIN_RUN_LENGTH
218219
&& (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()
220221
{
221222
// change to run model
222-
if count > MIN_RUN_LENGTH {
223+
if length > MIN_RUN_LENGTH {
223224
// 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);
225226
}
226227
self.state = RleV1EncoderState::Run {
227-
value: buffer[count - MIN_RUN_LENGTH],
228+
value: buffer[length - MIN_RUN_LENGTH],
228229
delta: delta as i8,
229-
count: MIN_RUN_LENGTH,
230+
length: MIN_RUN_LENGTH,
230231
}
231-
} else if count == MAX_LITERAL_LENGTH {
232+
} else if length == MAX_LITERAL_LENGTH {
232233
// reach buffer limit, write literals and change to empty state
233234
write_literals::<_, S>(&mut self.writer, buffer, MAX_LITERAL_LENGTH);
234235
self.state = RleV1EncoderState::Empty;
@@ -245,9 +246,9 @@ impl<N: NInt, S: EncodingSign> RleV1Encoder<N, S> {
245246
RleV1EncoderState::Run {
246247
value,
247248
delta,
248-
count,
249+
length,
249250
} => {
250-
write_run::<_, S>(&mut self.writer, value, delta, count);
251+
write_run::<_, S>(&mut self.writer, value, delta, length);
251252
}
252253
RleV1EncoderState::Literal { buffer } => {
253254
write_literals::<_, S>(&mut self.writer, &buffer, buffer.len());
@@ -328,6 +329,14 @@ mod tests {
328329
let original = (1..=100).rev().collect::<Vec<_>>();
329330
let encoded = [0x61, 0xff, 0x64];
330331
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);
331340
Ok(())
332341
}
333342

0 commit comments

Comments
 (0)