Encode a slice of i64 values using Delta + ZigZag-varint compression.
(values: &[i64])
| 88 | |
| 89 | /// Encode a slice of i64 values using Delta + ZigZag-varint compression. |
| 90 | pub fn encode(values: &[i64]) -> Vec<u8> { |
| 91 | let count = values.len() as u32; |
| 92 | // Estimate: header(4) + first_value(8) + ~2 bytes per delta. |
| 93 | let mut out = Vec::with_capacity(12 + values.len() * 2); |
| 94 | |
| 95 | out.extend_from_slice(&count.to_le_bytes()); |
| 96 | |
| 97 | if values.is_empty() { |
| 98 | return out; |
| 99 | } |
| 100 | |
| 101 | out.extend_from_slice(&values[0].to_le_bytes()); |
| 102 | |
| 103 | for i in 1..values.len() { |
| 104 | let delta = values[i].wrapping_sub(values[i - 1]); |
| 105 | write_varint(&mut out, zigzag_encode(delta)); |
| 106 | } |
| 107 | |
| 108 | out |
| 109 | } |
| 110 | |
| 111 | /// Decode Delta-compressed bytes back to i64 values. |
| 112 | pub fn decode(data: &[u8]) -> Result<Vec<i64>, CodecError> { |