From 8106eadf662018f77bc075bee6770d03180dddf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lena=20Hellstr=C3=B6m?= Date: Thu, 13 Jan 2022 12:26:09 +0100 Subject: [PATCH] Switch Encode to take &mut E (#471) --- derive/src/derive_enum.rs | 14 ++--- derive/src/derive_struct.rs | 29 +++++---- src/enc/impl_tuples.rs | 88 +++++++++++++------------- src/enc/impls.rs | 120 ++++++++++++++++++------------------ src/enc/mod.rs | 6 +- src/features/atomic.rs | 55 +++++++++++++---- src/features/impl_alloc.rs | 48 +++++++-------- src/features/impl_std.rs | 46 +++++++------- src/features/serde/mod.rs | 8 +-- tests/alloc.rs | 6 +- tests/issues.rs | 3 + tests/issues/issue_459.rs | 16 +++++ tests/issues/issue_467.rs | 2 +- tests/std.rs | 6 +- 14 files changed, 251 insertions(+), 196 deletions(-) create mode 100644 tests/issues/issue_459.rs diff --git a/derive/src/derive_enum.rs b/derive/src/derive_enum.rs index c2016e2..de6ee26 100644 --- a/derive/src/derive_enum.rs +++ b/derive/src/derive_enum.rs @@ -29,7 +29,7 @@ impl DeriveEnum { .generate_fn("encode") .with_generic("E", ["bincode::enc::Encoder"]) .with_self_arg(FnSelfArg::RefSelf) - .with_arg("mut encoder", "E") + .with_arg("encoder", "&mut E") .with_return_type("core::result::Result<(), bincode::error::EncodeError>") .body(|fn_body| { fn_body.ident_str("match"); @@ -70,9 +70,9 @@ impl DeriveEnum { // Note that the fields are available as locals because of the match destructuring above // { // encoder.encode_u32(n)?; - // bincode::enc::Encode::encode(a, &mut encoder)?; - // bincode::enc::Encode::encode(b, &mut encoder)?; - // bincode::enc::Encode::encode(c, &mut encoder)?; + // bincode::enc::Encode::encode(a, encoder)?; + // bincode::enc::Encode::encode(b, encoder)?; + // bincode::enc::Encode::encode(c, encoder)?; // } match_body.group(Delimiter::Brace, |body| { // variant index @@ -84,7 +84,7 @@ impl DeriveEnum { Ok(()) })?; args.punct(','); - args.push_parsed("&mut encoder")?; + args.push_parsed("encoder")?; Ok(()) })?; body.punct('?'); @@ -93,12 +93,12 @@ impl DeriveEnum { for field_name in variant.fields.names() { if field_name.attributes().has_attribute(FieldAttribute::WithSerde)? { body.push_parsed(format!( - "bincode::enc::Encode::encode(&bincode::serde::Compat({}), &mut encoder)?;", + "bincode::enc::Encode::encode(&bincode::serde::Compat({}), encoder)?;", field_name.to_string_with_prefix(TUPLE_FIELD_PREFIX), ))?; } else { body.push_parsed(format!( - "bincode::enc::Encode::encode({}, &mut encoder)?;", + "bincode::enc::Encode::encode({}, encoder)?;", field_name.to_string_with_prefix(TUPLE_FIELD_PREFIX), )) ?; diff --git a/derive/src/derive_struct.rs b/derive/src/derive_struct.rs index 77f0f2c..ce3a78a 100644 --- a/derive/src/derive_struct.rs +++ b/derive/src/derive_struct.rs @@ -15,28 +15,31 @@ impl DeriveStruct { .impl_for("bincode::enc::Encode")? .modify_generic_constraints(|generics, where_constraints| { for g in generics.iter_generics() { - where_constraints.push_constraint(g, "bincode::enc::Encode").unwrap(); + where_constraints + .push_constraint(g, "bincode::enc::Encode") + .unwrap(); } }) .generate_fn("encode") .with_generic("E", ["bincode::enc::Encoder"]) .with_self_arg(virtue::generate::FnSelfArg::RefSelf) - .with_arg("mut encoder", "E") + .with_arg("encoder", "&mut E") .with_return_type("core::result::Result<(), bincode::error::EncodeError>") .body(|fn_body| { for field in fields.names() { - if field.attributes().has_attribute(FieldAttribute::WithSerde)? { - fn_body - .push_parsed(format!( - "bincode::Encode::encode(&bincode::serde::Compat(&self.{}), &mut encoder)?;", - field - ))?; + if field + .attributes() + .has_attribute(FieldAttribute::WithSerde)? + { + fn_body.push_parsed(format!( + "bincode::Encode::encode(&bincode::serde::Compat(&self.{}), encoder)?;", + field + ))?; } else { - fn_body - .push_parsed(format!( - "bincode::enc::Encode::encode(&self.{}, &mut encoder)?;", - field - ))?; + fn_body.push_parsed(format!( + "bincode::enc::Encode::encode(&self.{}, encoder)?;", + field + ))?; } } fn_body.push_parsed("Ok(())")?; diff --git a/src/enc/impl_tuples.rs b/src/enc/impl_tuples.rs index 3ab46b1..c67b869 100644 --- a/src/enc/impl_tuples.rs +++ b/src/enc/impl_tuples.rs @@ -5,8 +5,8 @@ impl Encode for (A,) where A: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; Ok(()) } } @@ -16,9 +16,9 @@ where A: Encode, B: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; - self.1.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; + self.1.encode(encoder)?; Ok(()) } } @@ -29,10 +29,10 @@ where B: Encode, C: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; - self.1.encode(&mut encoder)?; - self.2.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; + self.1.encode(encoder)?; + self.2.encode(encoder)?; Ok(()) } } @@ -44,11 +44,11 @@ where C: Encode, D: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; - self.1.encode(&mut encoder)?; - self.2.encode(&mut encoder)?; - self.3.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; + self.1.encode(encoder)?; + self.2.encode(encoder)?; + self.3.encode(encoder)?; Ok(()) } } @@ -61,12 +61,12 @@ where D: Encode, E: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; - self.1.encode(&mut encoder)?; - self.2.encode(&mut encoder)?; - self.3.encode(&mut encoder)?; - self.4.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; + self.1.encode(encoder)?; + self.2.encode(encoder)?; + self.3.encode(encoder)?; + self.4.encode(encoder)?; Ok(()) } } @@ -80,13 +80,13 @@ where E: Encode, F: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; - self.1.encode(&mut encoder)?; - self.2.encode(&mut encoder)?; - self.3.encode(&mut encoder)?; - self.4.encode(&mut encoder)?; - self.5.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; + self.1.encode(encoder)?; + self.2.encode(encoder)?; + self.3.encode(encoder)?; + self.4.encode(encoder)?; + self.5.encode(encoder)?; Ok(()) } } @@ -101,14 +101,14 @@ where F: Encode, G: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; - self.1.encode(&mut encoder)?; - self.2.encode(&mut encoder)?; - self.3.encode(&mut encoder)?; - self.4.encode(&mut encoder)?; - self.5.encode(&mut encoder)?; - self.6.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; + self.1.encode(encoder)?; + self.2.encode(encoder)?; + self.3.encode(encoder)?; + self.4.encode(encoder)?; + self.5.encode(encoder)?; + self.6.encode(encoder)?; Ok(()) } } @@ -124,15 +124,15 @@ where G: Encode, H: Encode, { - fn encode<_E: Encoder>(&self, mut encoder: _E) -> Result<(), EncodeError> { - self.0.encode(&mut encoder)?; - self.1.encode(&mut encoder)?; - self.2.encode(&mut encoder)?; - self.3.encode(&mut encoder)?; - self.4.encode(&mut encoder)?; - self.5.encode(&mut encoder)?; - self.6.encode(&mut encoder)?; - self.7.encode(&mut encoder)?; + fn encode<_E: Encoder>(&self, encoder: &mut _E) -> Result<(), EncodeError> { + self.0.encode(encoder)?; + self.1.encode(encoder)?; + self.2.encode(encoder)?; + self.3.encode(encoder)?; + self.4.encode(encoder)?; + self.5.encode(encoder)?; + self.6.encode(encoder)?; + self.7.encode(encoder)?; Ok(()) } } diff --git a/src/enc/impls.rs b/src/enc/impls.rs index 0b80500..5d3c214 100644 --- a/src/enc/impls.rs +++ b/src/enc/impls.rs @@ -18,37 +18,37 @@ use core::{ }; impl Encode for () { - fn encode(&self, _: E) -> Result<(), EncodeError> { + fn encode(&self, _: &mut E) -> Result<(), EncodeError> { Ok(()) } } impl Encode for PhantomData { - fn encode(&self, _: E) -> Result<(), EncodeError> { + fn encode(&self, _: &mut E) -> Result<(), EncodeError> { Ok(()) } } impl Encode for bool { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { if *self { 1u8 } else { 0u8 }.encode(encoder) } } impl Encode for u8 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { encoder.writer().write(&[*self]) } } impl Encode for NonZeroU8 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for u16 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_u16(encoder.writer(), E::C::ENDIAN, *self) @@ -62,13 +62,13 @@ impl Encode for u16 { } impl Encode for NonZeroU16 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for u32 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_u32(encoder.writer(), E::C::ENDIAN, *self) @@ -82,13 +82,13 @@ impl Encode for u32 { } impl Encode for NonZeroU32 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for u64 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_u64(encoder.writer(), E::C::ENDIAN, *self) @@ -102,13 +102,13 @@ impl Encode for u64 { } impl Encode for NonZeroU64 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for u128 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_u128(encoder.writer(), E::C::ENDIAN, *self) @@ -122,13 +122,13 @@ impl Encode for u128 { } impl Encode for NonZeroU128 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for usize { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_usize(encoder.writer(), E::C::ENDIAN, *self) @@ -142,25 +142,25 @@ impl Encode for usize { } impl Encode for NonZeroUsize { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for i8 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { encoder.writer().write(&[*self as u8]) } } impl Encode for NonZeroI8 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for i16 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_i16(encoder.writer(), E::C::ENDIAN, *self) @@ -174,13 +174,13 @@ impl Encode for i16 { } impl Encode for NonZeroI16 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for i32 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_i32(encoder.writer(), E::C::ENDIAN, *self) @@ -194,13 +194,13 @@ impl Encode for i32 { } impl Encode for NonZeroI32 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for i64 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_i64(encoder.writer(), E::C::ENDIAN, *self) @@ -214,13 +214,13 @@ impl Encode for i64 { } impl Encode for NonZeroI64 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for i128 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_i128(encoder.writer(), E::C::ENDIAN, *self) @@ -234,13 +234,13 @@ impl Encode for i128 { } impl Encode for NonZeroI128 { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for isize { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::INT_ENCODING { IntEncoding::Variable => { crate::varint::varint_encode_isize(encoder.writer(), E::C::ENDIAN, *self) @@ -254,13 +254,13 @@ impl Encode for isize { } impl Encode for NonZeroIsize { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.get().encode(encoder) } } impl Encode for f32 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::ENDIAN { Endian::Big => encoder.writer().write(&self.to_be_bytes()), Endian::Little => encoder.writer().write(&self.to_le_bytes()), @@ -269,7 +269,7 @@ impl Encode for f32 { } impl Encode for f64 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match E::C::ENDIAN { Endian::Big => encoder.writer().write(&self.to_be_bytes()), Endian::Little => encoder.writer().write(&self.to_le_bytes()), @@ -278,14 +278,14 @@ impl Encode for f64 { } impl Encode for char { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { encode_utf8(encoder.writer(), *self) } } impl Encode for &'_ [u8] { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - super::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + super::encode_slice_len(encoder, self.len())?; encoder.writer().write(self) } } @@ -330,23 +330,23 @@ fn encode_utf8(writer: &mut impl Writer, c: char) -> Result<(), EncodeError> { // but those implementations overlap because u8 also implements Encodeabl // // default impl Encode for &'_ [u8] { -// fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { +// fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { // encoder.encode_slice(*self) // } // } // // impl Encode for &'_ [T] { -// fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { -// self.len().encode(&mut encoder)?; +// fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { +// self.len().encode(encoder)?; // for item in self.iter() { -// item.encode(&mut encoder)?; +// item.encode(encoder)?; // } // Ok(()) // } // } impl Encode for &'_ str { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_bytes().encode(encoder) } } @@ -355,12 +355,12 @@ impl Encode for [T; N] where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { if !E::C::SKIP_FIXED_ARRAY_LENGTH { - super::encode_slice_len(&mut encoder, N)?; + super::encode_slice_len(encoder, N)?; } for item in self.iter() { - item.encode(&mut encoder)?; + item.encode(encoder)?; } Ok(()) } @@ -370,8 +370,8 @@ impl Encode for Option where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - super::encode_option_variant(&mut encoder, self)?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + super::encode_option_variant(encoder, self)?; if let Some(val) = self { val.encode(encoder)?; } @@ -384,14 +384,14 @@ where T: Encode, U: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match self { Ok(val) => { - 0u8.encode(&mut encoder)?; + 0u8.encode(encoder)?; val.encode(encoder) } Err(err) => { - 1u8.encode(&mut encoder)?; + 1u8.encode(encoder)?; err.encode(encoder) } } @@ -402,7 +402,7 @@ impl Encode for Cell where T: Encode + Copy, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(&self.get(), encoder) } } @@ -411,7 +411,7 @@ impl Encode for RefCell where T: Encode, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { let borrow_guard = self .try_borrow() .map_err(|e| EncodeError::RefCellAlreadyBorrowed { @@ -423,9 +423,9 @@ where } impl Encode for Duration { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - self.as_secs().encode(&mut encoder)?; - self.subsec_nanos().encode(&mut encoder)?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.as_secs().encode(encoder)?; + self.subsec_nanos().encode(encoder)?; Ok(()) } } @@ -434,9 +434,9 @@ impl Encode for Range where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - self.start.encode(&mut encoder)?; - self.end.encode(&mut encoder)?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.start.encode(encoder)?; + self.end.encode(encoder)?; Ok(()) } } @@ -445,9 +445,9 @@ impl Encode for RangeInclusive where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - self.start().encode(&mut encoder)?; - self.end().encode(&mut encoder)?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.start().encode(encoder)?; + self.end().encode(encoder)?; Ok(()) } } @@ -456,17 +456,17 @@ impl Encode for Bound where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match self { Self::Unbounded => { 0u32.encode(encoder)?; } Self::Included(val) => { - 1u32.encode(&mut encoder)?; + 1u32.encode(encoder)?; val.encode(encoder)?; } Self::Excluded(val) => { - 2u32.encode(&mut encoder)?; + 2u32.encode(encoder)?; val.encode(encoder)?; } } @@ -478,7 +478,7 @@ impl<'a, T> Encode for &'a T where T: Encode, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } } diff --git a/src/enc/mod.rs b/src/enc/mod.rs index bb11057..bdfef79 100644 --- a/src/enc/mod.rs +++ b/src/enc/mod.rs @@ -16,7 +16,7 @@ pub use self::encoder::EncoderImpl; /// This trait will be automatically implemented if you enable the `derive` feature and add `#[derive(bincode::Encode)]` to your trait. pub trait Encode { /// Encode a given type. - fn encode(&self, encoder: E) -> Result<(), EncodeError>; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError>; } /// Helper trait to encode basic types into. @@ -54,7 +54,7 @@ where /// Encode the variant of the given option. Will not encode the option itself. #[inline] pub(crate) fn encode_option_variant( - encoder: E, + encoder: &mut E, value: &Option, ) -> Result<(), EncodeError> { match value { @@ -65,6 +65,6 @@ pub(crate) fn encode_option_variant( /// Encodes the length of any slice, container, etc into the given encoder #[inline] -pub(crate) fn encode_slice_len(encoder: E, len: usize) -> Result<(), EncodeError> { +pub(crate) fn encode_slice_len(encoder: &mut E, len: usize) -> Result<(), EncodeError> { (len as u64).encode(encoder) } diff --git a/src/features/atomic.rs b/src/features/atomic.rs index 192d8d9..c1c4d24 100644 --- a/src/features/atomic.rs +++ b/src/features/atomic.rs @@ -5,7 +5,10 @@ use core::sync::atomic::{ }; impl Encode for AtomicBool { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -17,7 +20,10 @@ impl Decode for AtomicBool { } impl Encode for AtomicU8 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -29,7 +35,10 @@ impl Decode for AtomicU8 { } impl Encode for AtomicU16 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -41,7 +50,10 @@ impl Decode for AtomicU16 { } impl Encode for AtomicU32 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -53,7 +65,10 @@ impl Decode for AtomicU32 { } impl Encode for AtomicU64 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -65,7 +80,10 @@ impl Decode for AtomicU64 { } impl Encode for AtomicUsize { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -77,7 +95,10 @@ impl Decode for AtomicUsize { } impl Encode for AtomicI8 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -89,7 +110,10 @@ impl Decode for AtomicI8 { } impl Encode for AtomicI16 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -101,7 +125,10 @@ impl Decode for AtomicI16 { } impl Encode for AtomicI32 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -113,7 +140,10 @@ impl Decode for AtomicI32 { } impl Encode for AtomicI64 { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } @@ -125,7 +155,10 @@ impl Decode for AtomicI64 { } impl Encode for AtomicIsize { - fn encode(&self, encoder: E) -> Result<(), crate::error::EncodeError> { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), crate::error::EncodeError> { self.load(Ordering::SeqCst).encode(encoder) } } diff --git a/src/features/impl_alloc.rs b/src/features/impl_alloc.rs index 33bc640..ea97cd6 100644 --- a/src/features/impl_alloc.rs +++ b/src/features/impl_alloc.rs @@ -70,10 +70,10 @@ impl Encode for BinaryHeap where T: Encode + Ord, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - crate::enc::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; for val in self.iter() { - val.encode(&mut encoder)?; + val.encode(encoder)?; } Ok(()) } @@ -106,11 +106,11 @@ where K: Encode + Ord, V: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - crate::enc::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; for (key, val) in self.iter() { - key.encode(&mut encoder)?; - val.encode(&mut encoder)?; + key.encode(encoder)?; + val.encode(encoder)?; } Ok(()) } @@ -140,10 +140,10 @@ impl Encode for BTreeSet where T: Encode + Ord, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - crate::enc::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; for item in self.iter() { - item.encode(&mut encoder)?; + item.encode(encoder)?; } Ok(()) } @@ -173,10 +173,10 @@ impl Encode for VecDeque where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - crate::enc::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; for item in self.iter() { - item.encode(&mut encoder)?; + item.encode(encoder)?; } Ok(()) } @@ -205,10 +205,10 @@ impl Encode for Vec where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - crate::enc::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; for item in self.iter() { - item.encode(&mut encoder)?; + item.encode(encoder)?; } Ok(()) } @@ -222,7 +222,7 @@ impl Decode for String { } impl Encode for String { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_bytes().encode(encoder) } } @@ -241,7 +241,7 @@ impl Encode for Box where T: Encode, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } } @@ -260,10 +260,10 @@ impl Encode for Box<[T]> where T: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - crate::enc::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; for item in self.iter() { - item.encode(&mut encoder)?; + item.encode(encoder)?; } Ok(()) } @@ -298,7 +298,7 @@ impl<'cow, T> Encode for Cow<'cow, T> where T: Encode + Clone, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_ref().encode(encoder) } } @@ -317,7 +317,7 @@ impl Encode for Rc where T: Encode, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } } @@ -338,7 +338,7 @@ impl Encode for Arc where T: Encode, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } } diff --git a/src/features/impl_std.rs b/src/features/impl_std.rs index d30e27d..f06c26e 100644 --- a/src/features/impl_std.rs +++ b/src/features/impl_std.rs @@ -108,7 +108,7 @@ impl<'storage, W: std::io::Write> Writer for IoWriter<'storage, W> { } impl<'a> Encode for &'a CStr { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.to_bytes_with_nul().encode(encoder) } } @@ -121,7 +121,7 @@ impl<'de> BorrowDecode<'de> for &'de CStr { } impl Encode for CString { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_bytes_with_nul().encode(encoder) } } @@ -144,7 +144,7 @@ impl Encode for Mutex where T: Encode, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { let t = self.lock().map_err(|_| EncodeError::LockFailed { type_name: core::any::type_name::>(), })?; @@ -166,7 +166,7 @@ impl Encode for RwLock where T: Encode, { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { let t = self.read().map_err(|_| EncodeError::LockFailed { type_name: core::any::type_name::>(), })?; @@ -185,7 +185,7 @@ where } impl Encode for SystemTime { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { let duration = self.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| { EncodeError::InvalidSystemTime { inner: e, @@ -207,7 +207,7 @@ impl Decode for SystemTime { } impl Encode for &'_ Path { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match self.to_str() { Some(str) => str.encode(encoder), None => Err(EncodeError::InvalidPathCharacters), @@ -223,7 +223,7 @@ impl<'de> BorrowDecode<'de> for &'de Path { } impl Encode for PathBuf { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_path().encode(encoder) } } @@ -236,14 +236,14 @@ impl Decode for PathBuf { } impl Encode for IpAddr { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match self { IpAddr::V4(v4) => { - 0u32.encode(&mut encoder)?; + 0u32.encode(encoder)?; v4.encode(encoder) } IpAddr::V6(v6) => { - 1u32.encode(&mut encoder)?; + 1u32.encode(encoder)?; v6.encode(encoder) } } @@ -265,7 +265,7 @@ impl Decode for IpAddr { } impl Encode for Ipv4Addr { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.octets().encode(encoder) } } @@ -277,7 +277,7 @@ impl Decode for Ipv4Addr { } impl Encode for Ipv6Addr { - fn encode(&self, encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.octets().encode(encoder) } } @@ -289,14 +289,14 @@ impl Decode for Ipv6Addr { } impl Encode for SocketAddr { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { match self { SocketAddr::V4(v4) => { - 0u32.encode(&mut encoder)?; + 0u32.encode(encoder)?; v4.encode(encoder) } SocketAddr::V6(v6) => { - 1u32.encode(&mut encoder)?; + 1u32.encode(encoder)?; v6.encode(encoder) } } @@ -318,8 +318,8 @@ impl Decode for SocketAddr { } impl Encode for SocketAddrV4 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - self.ip().encode(&mut encoder)?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.ip().encode(encoder)?; self.port().encode(encoder) } } @@ -333,8 +333,8 @@ impl Decode for SocketAddrV4 { } impl Encode for SocketAddrV6 { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - self.ip().encode(&mut encoder)?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.ip().encode(encoder)?; self.port().encode(encoder) } } @@ -355,11 +355,11 @@ where K: Encode, V: Encode, { - fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { - crate::enc::encode_slice_len(&mut encoder, self.len())?; + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; for (k, v) in self.iter() { - Encode::encode(k, &mut encoder)?; - Encode::encode(v, &mut encoder)?; + Encode::encode(k, encoder)?; + Encode::encode(v, encoder)?; } Ok(()) } diff --git a/src/features/serde/mod.rs b/src/features/serde/mod.rs index 314ec72..9cd6729 100644 --- a/src/features/serde/mod.rs +++ b/src/features/serde/mod.rs @@ -113,9 +113,9 @@ where { fn encode( &self, - mut encoder: E, + encoder: &mut E, ) -> Result<(), crate::error::EncodeError> { - let serializer = ser::SerdeEncoder { enc: &mut encoder }; + let serializer = ser::SerdeEncoder { enc: encoder }; self.0.serialize(serializer)?; Ok(()) } @@ -150,9 +150,9 @@ where { fn encode( &self, - mut encoder: E, + encoder: &mut E, ) -> Result<(), crate::error::EncodeError> { - let serializer = ser::SerdeEncoder { enc: &mut encoder }; + let serializer = ser::SerdeEncoder { enc: encoder }; self.0.serialize(serializer)?; Ok(()) } diff --git a/tests/alloc.rs b/tests/alloc.rs index 215916a..715de2a 100644 --- a/tests/alloc.rs +++ b/tests/alloc.rs @@ -20,10 +20,10 @@ struct Foo { impl bincode::enc::Encode for Foo { fn encode( &self, - mut encoder: E, + encoder: &mut E, ) -> Result<(), bincode::error::EncodeError> { - self.a.encode(&mut encoder)?; - self.b.encode(&mut encoder)?; + self.a.encode(encoder)?; + self.b.encode(encoder)?; Ok(()) } } diff --git a/tests/issues.rs b/tests/issues.rs index cecf2b3..564410e 100644 --- a/tests/issues.rs +++ b/tests/issues.rs @@ -8,3 +8,6 @@ mod issue_427; #[path = "issues/issue_467.rs"] mod issue_467; + +#[path = "issues/issue_459.rs"] +mod issue_459; diff --git a/tests/issues/issue_459.rs b/tests/issues/issue_459.rs new file mode 100644 index 0000000..7b55fca --- /dev/null +++ b/tests/issues/issue_459.rs @@ -0,0 +1,16 @@ +#![cfg(all(feature = "std", feature = "derive"))] + +extern crate std; + +use std::collections::BTreeMap; + +#[derive(bincode::Encode)] +struct AllTypes(BTreeMap); + +#[test] +fn test_issue_459() { + let _result = bincode::encode_to_vec( + AllTypes(BTreeMap::new()), + bincode::config::Configuration::standard(), + ); +} diff --git a/tests/issues/issue_467.rs b/tests/issues/issue_467.rs index 8cfe8e5..03c1d25 100644 --- a/tests/issues/issue_467.rs +++ b/tests/issues/issue_467.rs @@ -4,7 +4,7 @@ extern crate std; use std::collections::BTreeMap; -#[derive(bincode::Decode)] +#[derive(bincode::Decode, bincode::Encode)] struct AllTypes(BTreeMap); #[test] diff --git a/tests/std.rs b/tests/std.rs index e1e49cf..89fb092 100644 --- a/tests/std.rs +++ b/tests/std.rs @@ -22,10 +22,10 @@ struct Foo { impl bincode::enc::Encode for Foo { fn encode( &self, - mut encoder: E, + encoder: &mut E, ) -> Result<(), bincode::error::EncodeError> { - self.a.encode(&mut encoder)?; - self.b.encode(&mut encoder)?; + self.a.encode(encoder)?; + self.b.encode(encoder)?; Ok(()) } }