Added a big comment about serialization buffer size.
This commit is contained in:
parent
396c9246d8
commit
c1a850f1f1
1 changed files with 23 additions and 1 deletions
24
src/typed.rs
24
src/typed.rs
|
@ -43,6 +43,29 @@ impl<W: Write, T: Serialize> Sender<W, T> {
|
||||||
///
|
///
|
||||||
/// See also: [`send`](#method.send)
|
/// See also: [`send`](#method.send)
|
||||||
pub fn queue(&mut self, v: &T) -> Result<usize> {
|
pub fn queue(&mut self, v: &T) -> Result<usize> {
|
||||||
|
// This uses a dynamically allocated buffer.
|
||||||
|
//
|
||||||
|
// I couldn't get a no_std version to compile with a stack-allocated
|
||||||
|
// buffer as [0u8; size_of::<T>()] due to compiler errors like:
|
||||||
|
// ```
|
||||||
|
// error[E0401]: can't use type parameters from outer function; try using a local type parameter instead
|
||||||
|
// --> src/typed.rs:46:39
|
||||||
|
// |
|
||||||
|
// 46 | const _sbl: usize = size_of::<T>();
|
||||||
|
// | ^ use of type variable from outer function
|
||||||
|
// ```
|
||||||
|
// I think this may require const generics
|
||||||
|
// (rust-lang tracking issue:
|
||||||
|
// https://github.com/rust-lang/rust/issues/44580).
|
||||||
|
//
|
||||||
|
// When I need to write a no_std version I see a few easy options:
|
||||||
|
// 1. Caller supplies a reference to a buffer, we can assert! that
|
||||||
|
// it's long enough. Annoying to use.
|
||||||
|
// 2. Choose a reasonable length buffer and assert it's long enough.
|
||||||
|
// Won't work for large enough structs, may consume an inappropriate
|
||||||
|
// amount of memory for embedded use.
|
||||||
|
// 3. Provide overloads for 1 and 2. For most cases the fixed size
|
||||||
|
// buffer will be fine, and if not you can provide your own.
|
||||||
let mut ser_buf = vec![0u8; size_of::<T>()];
|
let mut ser_buf = vec![0u8; size_of::<T>()];
|
||||||
|
|
||||||
let ser_len = ssmarshal::serialize(&mut ser_buf, v)?;
|
let ser_len = ssmarshal::serialize(&mut ser_buf, v)?;
|
||||||
|
@ -50,7 +73,6 @@ impl<W: Write, T: Serialize> Sender<W, T> {
|
||||||
#[cfg(feature = "trace")] {
|
#[cfg(feature = "trace")] {
|
||||||
println!("framed: Serialized = {:?}", ser);
|
println!("framed: Serialized = {:?}", ser);
|
||||||
}
|
}
|
||||||
|
|
||||||
super::encode_to_writer(&ser, &mut self.w)
|
super::encode_to_writer(&ser, &mut self.w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue