MCPcopy Create free account
hub / github.com/RustCrypto/utils / parse_into_vec

Function parse_into_vec

blobby/src/decode.rs:142–187  ·  view source on GitHub ↗
(mut data: &[u8])

Source from the content-addressed store, hash-verified

140#[cfg(feature = "alloc")]
141#[allow(clippy::missing_panics_doc)]
142pub fn parse_into_vec(mut data: &[u8]) -> Result<alloc::vec::Vec<&[u8]>, Error> {
143 use alloc::{vec, vec::Vec};
144
145 let Header {
146 items_len,
147 dedup_len,
148 } = Header::parse(&mut data)?;
149
150 let mut dedup_index: Vec<&[u8]> = vec![&[]; dedup_len];
151
152 let mut i = 0;
153 while i < dedup_index.len() {
154 let m = try_read_vlq!(data);
155 let split = data.split_at(m);
156 dedup_index[i] = split.0;
157 data = split.1;
158 i += 1;
159 }
160
161 let mut res: Vec<&[u8]> = vec![&[]; items_len];
162
163 let mut i = 0;
164 while i < res.len() {
165 let val = try_read_vlq!(data);
166 // the least significant bit is used as a flag
167 let is_ref = (val & 1) != 0;
168 let val = val >> 1;
169 res[i] = if is_ref {
170 if val >= dedup_index.len() {
171 return Err(Error::InvalidIndex);
172 }
173 dedup_index[val]
174 } else {
175 if val > data.len() {
176 return Err(Error::UnexpectedEnd);
177 }
178 let split = data.split_at(val);
179 data = split.1;
180 split.0
181 };
182 i += 1;
183 }
184
185 assert!(data.is_empty());
186 Ok(res)
187}
188
189/// Parse data into a slice.
190#[macro_export]

Callers 2

decodeFunction · 0.85
blobby_rondtrip_testFunction · 0.85

Calls 2

lenMethod · 0.80
split_atMethod · 0.80

Tested by 1

blobby_rondtrip_testFunction · 0.68