add encoded_size function

This commit is contained in:
TyOverby 2015-01-16 13:21:35 -08:00
parent 97e675ac06
commit 89a6b007b1
3 changed files with 25 additions and 2 deletions

View File

@ -66,3 +66,15 @@ pub fn decode_from<R: Buffer, T: Decodable>(r: &mut R, size_limit: SizeLimit) ->
DecodingResult<T> {
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: Encodable>(t: &T) -> u64 {
use std::u64::MAX;
let mut size_checker = SizeChecker::new(MAX);
t.encode(&mut size_checker).ok();
size_checker.written
}

View File

@ -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))
}

View File

@ -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 {