| // Blobs don't need to be sorted. A map is used to collapse duplicates. A `BTreeMap` in particular is used to help with reproducible builds. |
| map: BTreeMap<Vec<u8>, u32>, |
| pub struct StagedBlobs(Blobs); |
| pub fn insert(&mut self, value: Vec<u8>) { |
| self.map.entry(value).or_default(); |
| pub fn stage(mut self) -> StagedBlobs { |
| for (value, index) in self.map.iter_mut() { |
| *index = self.stream.len() as _; |
| 0..=0x7F => self.stream.push(value.len() as _), |
| self.stream.push((0x80 | value.len() >> 8) as _); |
| self.stream.push((0xFF & value.len()) as _); |
| self.stream.push((0xC0 | value.len() >> 24) as _); |
| self.stream.push((0xFF & value.len() >> 16) as _); |
| self.stream.push((0xFF & value.len() >> 8) as _); |
| self.stream.push((0xFF & value.len()) as _); |
| self.stream.extend_from_slice(value); |
| self.stream.resize(round(self.stream.len(), 4), 0); |
| pub fn stream(self) -> Vec<u8> { |
| pub fn index(&self, value: &[u8]) -> u32 { |