mirror of https://git.sr.ht/~stygianentity/bincode
add encoded_size function
This commit is contained in:
parent
97e675ac06
commit
89a6b007b1
12
src/lib.rs
12
src/lib.rs
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
11
src/test.rs
11
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))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue