|
1 | 1 | // Copyright 2019-2022 ChainSafe Systems
|
2 | 2 | // SPDX-License-Identifier: Apache-2.0, MIT
|
3 | 3 |
|
| 4 | +/// The maximum varint that can be serialized on 9 bytes. |
| 5 | +const MAX_VARINT: u64 = 2u64.pow(63)-1; |
| 6 | + |
4 | 7 | #[derive(Default, Clone, Debug)]
|
5 | 8 | /// A `BitWriter` allows for efficiently writing bits to a byte buffer, up to a byte at a time.
|
6 | 9 | pub struct BitWriter {
|
@@ -37,6 +40,7 @@ impl BitWriter {
|
37 | 40 | /// Writes a given length to the buffer according to RLE+ encoding.
|
38 | 41 | pub fn write_len(&mut self, len: usize) {
|
39 | 42 | debug_assert!(len > 0);
|
| 43 | + debug_assert!(len <= (MAX_VARINT as usize)); |
40 | 44 |
|
41 | 45 | if len == 1 {
|
42 | 46 | // Block Single (prefix 1)
|
@@ -85,7 +89,7 @@ impl BitWriter {
|
85 | 89 |
|
86 | 90 | #[cfg(test)]
|
87 | 91 | mod tests {
|
88 |
| - use super::BitWriter; |
| 92 | + use super::{BitWriter, MAX_VARINT}; |
89 | 93 |
|
90 | 94 | #[test]
|
91 | 95 | fn write() {
|
@@ -178,4 +182,24 @@ mod tests {
|
178 | 182 | let mut writer = BitWriter::new();
|
179 | 183 | writer.write(0, 16);
|
180 | 184 | }
|
| 185 | + |
| 186 | + #[test] |
| 187 | + fn test_write_max_varint() { |
| 188 | + let mut writer = BitWriter::new(); |
| 189 | + writer.write(0b_0000_0100, 3); |
| 190 | + writer.write_len(MAX_VARINT as usize); |
| 191 | + let rle = writer.finish(); |
| 192 | + |
| 193 | + crate::BitField::from_bytes(&rle).unwrap(); |
| 194 | + } |
| 195 | + |
| 196 | + #[cfg(debug_assertions)] |
| 197 | + #[test] |
| 198 | + #[should_panic(expected = "assertion failed")] |
| 199 | + fn test_write_succ_max_varint() { |
| 200 | + let mut writer = BitWriter::new(); |
| 201 | + writer.write(0b_0000_0100, 3); |
| 202 | + writer.write_len(MAX_VARINT as usize + 1); |
| 203 | + writer.finish(); |
| 204 | + } |
181 | 205 | }
|
0 commit comments