(dict: &DimDict, out: &mut Vec<u8>)
| 59 | } |
| 60 | |
| 61 | fn encode_rle(dict: &DimDict, out: &mut Vec<u8>) -> ArrayResult<()> { |
| 62 | out.extend_from_slice(&RLE_MARKER.to_le_bytes()); |
| 63 | |
| 64 | // Compute runs over index stream. |
| 65 | let mut runs: Vec<(u32, u32)> = Vec::new(); // (value, length) |
| 66 | let mut i = 0; |
| 67 | while i < dict.indices.len() { |
| 68 | let val = dict.indices[i]; |
| 69 | let mut len = 1u32; |
| 70 | while i + (len as usize) < dict.indices.len() && dict.indices[i + (len as usize)] == val { |
| 71 | len += 1; |
| 72 | } |
| 73 | runs.push((val, len)); |
| 74 | i += len as usize; |
| 75 | } |
| 76 | |
| 77 | out.extend_from_slice(&(runs.len() as u32).to_le_bytes()); |
| 78 | for (val, len) in &runs { |
| 79 | out.extend_from_slice(&val.to_le_bytes()); |
| 80 | out.extend_from_slice(&len.to_le_bytes()); |
| 81 | } |
| 82 | |
| 83 | // Dict values. |
| 84 | out.extend_from_slice(&(dict.values.len() as u32).to_le_bytes()); |
| 85 | for cv in &dict.values { |
| 86 | let bytes = zerompk::to_msgpack_vec(cv).map_err(|e| ArrayError::SegmentCorruption { |
| 87 | detail: format!("rle coord dict encode: {e}"), |
| 88 | })?; |
| 89 | out.extend_from_slice(&(bytes.len() as u32).to_le_bytes()); |
| 90 | out.extend_from_slice(&bytes); |
| 91 | } |
| 92 | |
| 93 | Ok(()) |
| 94 | } |
| 95 | |
| 96 | /// Decode a DimDict from bytes previously encoded by `encode_coord_axis_rle`. |
| 97 | pub fn decode_coord_axis_rle(data: &[u8], pos: &mut usize) -> ArrayResult<DimDict> { |
no test coverage detected