vint32/
lib.rs

1/*! Fast vint u32 encoding for rust. Uses at most 5 bytes.
2
3# Examples
4```
5use vint32::encode_varint_into;
6let mut output = vec![];
7encode_varint_into(&mut output, 50);	
8assert_eq!(output.len(), 1);
9
10```
11
12*/
13
14#[cfg(feature = "common-encoding")]
15pub mod common_encode;
16pub mod iterator;
17pub mod vint_array;
18pub mod util;
19
20use std::io;
21use std::io::Read;
22use std::io::Write;
23
24/// `vint32` encode a unsigned 32-bit integer into a vec.
25///
26/// returns number of bytes written
27///
28#[inline]
29pub fn encode_varint_into(output: &mut Vec<u8>, mut value: u32) -> u8 {
30    let do_one = |output: &mut Vec<u8>, value: &mut u32| {
31        output.push(((*value & 127) | 128) as u8);
32        *value >>= 7;
33    };
34    let do_last = |output: &mut Vec<u8>, value: u32| {
35        output.push((value & 127) as u8);
36    };
37
38    if value < 1 << 7 {
39        //128
40        do_last(output, value);
41        1
42    } else if value < 1 << 14 {
43        do_one(output, &mut value);
44        do_last(output, value);
45        2
46    } else if value < 1 << 21 {
47        do_one(output, &mut value);
48        do_one(output, &mut value);
49        do_last(output, value);
50        3
51    } else if value < 1 << 28 {
52        do_one(output, &mut value);
53        do_one(output, &mut value);
54        do_one(output, &mut value);
55        do_last(output, value);
56        4
57    } else {
58        do_one(output, &mut value);
59        do_one(output, &mut value);
60        do_one(output, &mut value);
61        do_one(output, &mut value);
62        do_last(output, value);
63        5
64    }
65}
66
67/// `vint32` encode a unsigned 32-bit integer into a vec.
68///
69/// returns number of bytes written
70///ue`.
71#[inline]
72pub fn encode_varint_into_writer<W: Write>(mut output: W, mut value: u32) -> Result<u8, io::Error> {
73    let do_one = |output: &mut W, value: &mut u32| -> Result<(), io::Error> {
74        output.write_all(&[((*value & 127) | 128) as u8])?;
75        *value >>= 7;
76        Ok(())
77    };
78    let do_last = |output: &mut W, value: u32| -> Result<(), io::Error> {
79        output.write_all(&[(value & 127) as u8])?;
80        Ok(())
81    };
82
83    if value < 1 << 7 {
84        //128
85        do_last(&mut output, value)?;
86        Ok(1)
87    } else if value < 1 << 14 {
88        do_one(&mut output, &mut value)?;
89        do_last(&mut output, value)?;
90        Ok(2)
91    } else if value < 1 << 21 {
92        do_one(&mut output, &mut value)?;
93        do_one(&mut output, &mut value)?;
94        do_last(&mut output, value)?;
95        Ok(3)
96    } else if value < 1 << 28 {
97        do_one(&mut output, &mut value)?;
98        do_one(&mut output, &mut value)?;
99        do_one(&mut output, &mut value)?;
100        do_last(&mut output, value)?;
101        Ok(4)
102    } else {
103        do_one(&mut output, &mut value)?;
104        do_one(&mut output, &mut value)?;
105        do_one(&mut output, &mut value)?;
106        do_one(&mut output, &mut value)?;
107        do_last(&mut output, value)?;
108        Ok(5)
109    }
110}
111
112#[test]
113fn test_varint() {
114	use crate::iterator::VintArrayIterator;
115    let mut sink = vec![];
116    encode_varint_into(&mut sink, 5);
117    encode_varint_into(&mut sink, 127);
118    encode_varint_into(&mut sink, 128);
119    encode_varint_into(&mut sink, 50);
120    encode_varint_into(&mut sink, 500);
121    encode_varint_into(&mut sink, 5000);
122    encode_varint_into(&mut sink, 4_000_000_000);
123    assert_eq!(sink.len(), 14);
124
125    let mut iter = sink.iter().cloned();
126    assert_eq!(decode_varint(&mut iter), Some(5));
127    assert_eq!(decode_varint(&mut iter), Some(127));
128    assert_eq!(decode_varint(&mut iter), Some(128));
129    assert_eq!(decode_varint(&mut iter), Some(50));
130    assert_eq!(decode_varint(&mut iter), Some(500));
131    assert_eq!(decode_varint(&mut iter), Some(5000));
132    assert_eq!(decode_varint(&mut iter), Some(4_000_000_000));
133
134    let iter = VintArrayIterator {
135        data: &sink,
136        pos: 0,
137    };
138    let dat: Vec<_> = iter.collect();
139    assert_eq!(dat, vec![5, 127, 128, 50, 500, 5000, 4_000_000_000]);
140
141    use std::io::BufReader;
142    let mut reader = BufReader::new(&sink[..]);
143    assert_eq!(decode_from_reader(reader.get_mut()), Some(5));
144    assert_eq!(decode_from_reader(reader.get_mut()), Some(127));
145    assert_eq!(decode_from_reader(reader.get_mut()), Some(128));
146    assert_eq!(decode_from_reader(reader.get_mut()), Some(50));
147    assert_eq!(decode_from_reader(reader.get_mut()), Some(500));
148    assert_eq!(decode_from_reader(reader.get_mut()), Some(5000));
149    assert_eq!(decode_from_reader(reader.get_mut()), Some(4_000_000_000));
150    assert_eq!(decode_from_reader(reader.get_mut()), None);
151}
152
153/// Decode a `vint32`-encoded unsigned 32-bit integer from an iterator.
154/// Maximum space required are 5 bytes.
155///
156/// Will panic if incorrectly encoded.
157#[inline]
158pub fn decode_varint<I: Iterator<Item = u8>>(input: &mut I) -> Option<u32> {
159    let mut ret: u32 = 0;
160    if let Some(next) = input.next() {
161        ret |= u32::from(next) & 127;
162        if next & 128 == 0 {
163            return Some(ret);
164        }
165        let next = input.next().unwrap();
166        ret |= (u32::from(next) & 127) << 7;
167        if next & 128 == 0 {
168            return Some(ret);
169        }
170        let next = input.next().unwrap();
171        ret |= (u32::from(next) & 127) << 14;
172        if next & 128 == 0 {
173            return Some(ret);
174        }
175        let next = input.next().unwrap();
176        ret |= (u32::from(next) & 127) << 21;
177        if next & 128 == 0 {
178            return Some(ret);
179        }
180        let next = input.next().unwrap();
181        ret |= (u32::from(next) & 127) << 28;
182        Some(ret)
183    } else {
184        None
185    }
186}
187
188/// Decode a `vint32`-encoded unsigned 32-bit integer from a bytes slice.
189/// Maximum space required are 5 bytes.
190/// `pos` will be used to access the pos in the slice.
191/// `pos` will be incremented by the number of bytes used to dencode the u32.
192///
193/// Will panic if incorrectly encoded.
194#[inline]
195pub fn decode_varint_slice(data: &[u8], pos: &mut usize) -> Option<u32> {
196    if *pos == data.len() {
197        None
198    } else {
199        let next = data[*pos];
200        *pos += 1;
201        let mut ret: u32 = u32::from(next) & 127;
202        if next & 128 == 0 {
203            return Some(ret);
204        }
205        let next = data[*pos];
206        *pos += 1;
207        let mut shift_by = 7;
208        ret |= (u32::from(next) & 127) << shift_by;
209        if next & 128 == 0 {
210            return Some(ret);
211        }
212        let next = data[*pos];
213        *pos += 1;
214        shift_by += 7;
215        ret |= (u32::from(next) & 127) << shift_by;
216        if next & 128 == 0 {
217            return Some(ret);
218        }
219        let next = data[*pos];
220        *pos += 1;
221        shift_by += 7;
222        ret |= (u32::from(next) & 127) << shift_by;
223        if next & 128 == 0 {
224            return Some(ret);
225        }
226        let next = data[*pos];
227        *pos += 1;
228        shift_by += 7;
229        ret |= (u32::from(next) & 127) << shift_by;
230        Some(ret)
231    }
232}
233
234/// Decode a single `vint32`-encoded unsigned 32-bit integer from a `Read`.
235///
236/// Will panic if incorrectly encoded or `Read` returns an error.
237#[inline]
238pub fn decode_from_reader<R: Read>(r: &mut R) -> Option<u32> {
239    let mut iter = r.bytes().map(|el| el.unwrap());
240    decode_varint(&mut iter)
241}
242
243#[test]
244fn test_encode_decode_vint_very_large_number() {
245	use crate::vint_array::VIntArray;
246    let mut vint = VIntArray::default();
247    let dat = vec![4_000_000_000];
248    vint.encode_vals(&dat);
249    let decoded_data: Vec<u32> = vint.iter().collect();
250    assert_eq!(&dat, &decoded_data);
251}
252
253#[test]
254fn test_serialize() {
255	use crate::iterator::VintArrayIterator;
256	use crate::vint_array::VIntArray;
257    let mut vint = VIntArray::default();
258    let dat = vec![4_000_000_000];
259    vint.encode_vals(&dat);
260
261    let data = vint.serialize();
262
263    let iter = VintArrayIterator::from_serialized_vint_array(&data);
264    let decoded_data: Vec<u32> = iter.collect();
265    assert_eq!(&dat, &decoded_data);
266}
267
268// #[cfg(test)]
269// mod tests {
270//     use crate::*;
271//     #[test]
272//     fn it_works() {
273//         for i in 0..u32::MAX {
274//             let mut vec = vec![];
275//             encode_varint_into(&mut vec, i);
276//             assert_eq!(decode_varint_slice(&vec, &mut 0).unwrap(), i);
277//         }
278//     }
279// }