1#[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#[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 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#[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 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#[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#[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#[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