diff --git a/src/lib.rs b/src/lib.rs index 7aa1b45..000b321 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,3 +66,15 @@ pub fn decode_from(r: &mut R, size_limit: SizeLimit) -> DecodingResult { Decodable::decode(&mut reader::DecoderReader::new(r, size_limit)) } + + +/// Returns the size that an object would be if encoded using bincode. +/// +/// This is used internally as part of the check for encode_into, but it can +/// be useful for preallocating buffers if thats your style. +pub fn encoded_size(t: &T) -> u64 { + use std::u64::MAX; + let mut size_checker = SizeChecker::new(MAX); + t.encode(&mut size_checker).ok(); + size_checker.written +} diff --git a/src/test.rs b/src/test.rs index 691fe19..525c82d 100644 --- a/src/test.rs +++ b/src/test.rs @@ -14,6 +14,7 @@ use super::{ encode, decode, decode_from, + encoded_size, DecodingError, DecodingResult }; @@ -220,3 +221,13 @@ fn too_big_encode() { assert!(encode(&"abcde", UpperBound(4)).is_err()); assert!(encode(&"abcde", UpperBound(5)).is_ok()); } + +#[test] +fn test_encoded_size() { + assert!(encoded_size(&0u8) == 1); + assert!(encoded_size(&0u16) == 2); + assert!(encoded_size(&0u32) == 4); + assert!(encoded_size(&0u64) == 8); + + assert!(encoded_size(&vec![0u32, 1u32, 2u32]) == 8 + 3 * (4)) +} diff --git a/src/writer.rs b/src/writer.rs index 1ac30a0..8b63371 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -20,8 +20,8 @@ pub struct EncoderWriter<'a, W: 'a> { } pub struct SizeChecker { - size_limit: u64, - written: u64 + pub size_limit: u64, + pub written: u64 } fn wrap_io(err: IoError) -> EncodingError {