MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / encode_rle

Function encode_rle

nodedb-array/src/codec/coord_rle.rs:61–94  ·  view source on GitHub ↗
(dict: &DimDict, out: &mut Vec<u8>)

Source from the content-addressed store, hash-verified

59}
60
61fn 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`.
97pub fn decode_coord_axis_rle(data: &[u8], pos: &mut usize) -> ArrayResult<DimDict> {

Callers 1

encode_coord_axis_rleFunction · 0.85

Calls 2

lenMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected