|
17 | 17 | use core::any::TypeId; |
18 | 18 | use core::{cmp, mem, slice}; |
19 | 19 |
|
| 20 | +use encoding::{CompactSizeEncoder, Encoder}; |
20 | 21 | use hashes::{sha256, sha256d, Hash}; |
21 | 22 | use hex::DisplayHex as _; |
22 | | -use internals::{compact_size, ToU64}; |
| 23 | +use internals::ToU64; |
23 | 24 | use io::{BufRead, Cursor, Read, Write}; |
24 | 25 |
|
25 | 26 | use super::IterReader; |
@@ -184,8 +185,9 @@ impl<W: Write + ?Sized> WriteExt for W { |
184 | 185 | } |
185 | 186 | #[inline] |
186 | 187 | fn emit_compact_size(&mut self, v: impl ToU64) -> Result<usize, io::Error> { |
187 | | - let encoded = compact_size::encode(v.to_u64()); |
188 | | - self.emit_slice(&encoded)?; |
| 188 | + let encoder = CompactSizeEncoder::new(v.to_u64().try_into().unwrap_or(usize::MAX)); |
| 189 | + let encoded = encoder.current_chunk(); |
| 190 | + self.emit_slice(encoded)?; |
189 | 191 | Ok(encoded.len()) |
190 | 192 | } |
191 | 193 | } |
@@ -349,19 +351,28 @@ impl_int_encodable!(i32, read_i32, emit_i32); |
349 | 351 | impl_int_encodable!(i64, read_i64, emit_i64); |
350 | 352 |
|
351 | 353 | /// Returns 1 for 0..=0xFC, 3 for 0xFD..=(2^16-1), 5 for 0x10000..=(2^32-1), and 9 otherwise. |
| 354 | +#[deprecated(since = "0.33.0", note = "use `consensus_encoding::CompactSizeEncoder::encoded_size` instead")] |
352 | 355 | #[inline] |
353 | 356 | pub const fn varint_size_u64(v: u64) -> usize { |
| 357 | + const LIMIT: u64 = if core::mem::size_of::<usize>() <= 8 { |
| 358 | + usize::MAX as u64 // Cast is ok, because usize is <= the size of u64 |
| 359 | + } else { |
| 360 | + u64::MAX |
| 361 | + }; |
| 362 | + |
| 363 | + #[allow(unreachable_patterns)] // Disable lint because this match is reachable on < 64 bit platforms |
354 | 364 | match v { |
355 | | - 0..=0xFC => 1, |
356 | | - 0xFD..=0xFFFF => 3, |
357 | | - 0x10000..=0xFFFFFFFF => 5, |
358 | | - _ => 9, |
| 365 | + 0..=LIMIT => encoding::CompactSizeEncoder::encoded_size(v as usize), // cast is ok because we just checked bounds |
| 366 | + _ => encoding::CompactSizeEncoder::encoded_size(usize::MAX), |
359 | 367 | } |
360 | 368 | } |
361 | 369 |
|
362 | 370 | /// Returns 1 for 0..=0xFC, 3 for 0xFD..=(2^16-1), 5 for 0x10000..=(2^32-1), and 9 otherwise. |
| 371 | +#[deprecated(since = "0.33.0", note = "use `consensus_encoding::CompactSizeEncoder::encoded_size` instead")] |
363 | 372 | #[inline] |
364 | | -pub fn varint_size(v: impl ToU64) -> usize { varint_size_u64(v.to_u64()) } |
| 373 | +pub fn varint_size(v: impl ToU64) -> usize { |
| 374 | + encoding::CompactSizeEncoder::encoded_size(v.to_u64().try_into().unwrap_or(usize::MAX)) |
| 375 | +} |
365 | 376 |
|
366 | 377 | impl Encodable for bool { |
367 | 378 | #[inline] |
@@ -807,25 +818,29 @@ mod tests { |
807 | 818 | assert_eq!(encode(0xFD), [0xFDu8, 0xFD, 0]); |
808 | 819 | assert_eq!(encode(0xFFF), [0xFDu8, 0xFF, 0xF]); |
809 | 820 | assert_eq!(encode(0xF0F0F0F), [0xFEu8, 0xF, 0xF, 0xF, 0xF]); |
| 821 | + #[cfg(target_pointer_width = "64")] |
810 | 822 | assert_eq!(encode(0xF0F0F0F0F0E0), vec![0xFFu8, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0, 0],); |
811 | 823 | assert_eq!(test_varint_encode(0xFF, &0x100000000_u64.to_le_bytes()).unwrap(), 0x100000000,); |
812 | 824 | assert_eq!(test_varint_encode(0xFE, &0x10000_u64.to_le_bytes()).unwrap(), 0x10000); |
813 | 825 | assert_eq!(test_varint_encode(0xFD, &0xFD_u64.to_le_bytes()).unwrap(), 0xFD); |
814 | 826 |
|
815 | 827 | // Test that length calc is working correctly |
816 | | - fn test_varint_len(varint: u64, expected: usize) { |
| 828 | + fn test_varint_len(varint: usize, expected: usize) { |
817 | 829 | let mut encoder = vec![]; |
818 | 830 | assert_eq!(encoder.emit_compact_size(varint).unwrap(), expected); |
819 | | - assert_eq!(varint_size(varint), expected); |
| 831 | + assert_eq!(encoding::CompactSizeEncoder::encoded_size(varint), expected); |
820 | 832 | } |
821 | 833 | test_varint_len(0, 1); |
822 | 834 | test_varint_len(0xFC, 1); |
823 | 835 | test_varint_len(0xFD, 3); |
824 | 836 | test_varint_len(0xFFFF, 3); |
825 | 837 | test_varint_len(0x10000, 5); |
826 | 838 | test_varint_len(0xFFFFFFFF, 5); |
827 | | - test_varint_len(0xFFFFFFFF + 1, 9); |
828 | | - test_varint_len(u64::MAX, 9); |
| 839 | + #[cfg(target_pointer_width = "64")] |
| 840 | + { |
| 841 | + test_varint_len(0xFFFFFFFF + 1, 9); |
| 842 | + test_varint_len(u64::MAX as usize, 9); |
| 843 | + } |
829 | 844 | } |
830 | 845 |
|
831 | 846 | #[test] |
|
0 commit comments