Compare commits

...

6 Commits

Author SHA1 Message Date
David Tolnay 09b78b24e9 Release 1.0.168 2023-07-08 17:52:06 -07:00
David Tolnay a622b8a74a Merge pull request #2495 from dtolnay/cautious
Allow larger preallocated capacity for smaller elements
2023-07-08 17:51:16 -07:00
David Tolnay 399ef081ec Allow larger preallocated capacity for smaller elements 2023-07-08 17:43:01 -07:00
David Tolnay 3686277e14 Merge pull request #2436 from Mingun/flatten-ignored-any
Allow to flatten `IgnoredAny`
2023-07-06 16:35:10 -07:00
Mingun 51799dd654 Allow to flatten IgnoredAny to ignore any additional data
Although any additional fields in struct by default are ignored, sometimes
this can be useful, if you use generic structures, for example
2023-04-30 01:59:55 +05:00
Mingun 732ac49321 Implement PartialEq for IgnoredAny so it can be used in tests 2023-04-30 01:58:07 +05:00
11 changed files with 72 additions and 25 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde" name = "serde"
version = "1.0.167" # remember to update html_root_url and serde_derive dependency version = "1.0.168" # remember to update html_root_url and serde_derive dependency
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
build = "build.rs" build = "build.rs"
categories = ["encoding", "no-std", "no-std::no-alloc"] categories = ["encoding", "no-std", "no-std::no-alloc"]
@@ -15,7 +15,7 @@ repository = "https://github.com/serde-rs/serde"
rust-version = "1.19" rust-version = "1.19"
[dependencies] [dependencies]
serde_derive = { version = "=1.0.167", optional = true, path = "../serde_derive" } serde_derive = { version = "=1.0.168", optional = true, path = "../serde_derive" }
[dev-dependencies] [dev-dependencies]
serde_derive = { version = "1.0", path = "../serde_derive" } serde_derive = { version = "1.0", path = "../serde_derive" }
+1 -1
View File
@@ -107,7 +107,7 @@ use de::{
/// # Ok(()) /// # Ok(())
/// # } /// # }
/// ``` /// ```
#[derive(Copy, Clone, Debug, Default)] #[derive(Copy, Clone, Debug, Default, PartialEq)]
pub struct IgnoredAny; pub struct IgnoredAny;
impl<'de> Visitor<'de> for IgnoredAny { impl<'de> Visitor<'de> for IgnoredAny {
+10 -9
View File
@@ -681,8 +681,8 @@ impl<'de> Visitor<'de> for CStringVisitor {
where where
A: SeqAccess<'de>, A: SeqAccess<'de>,
{ {
let len = size_hint::cautious(seq.size_hint()); let capacity = size_hint::cautious::<u8>(seq.size_hint());
let mut values = Vec::with_capacity(len); let mut values = Vec::<u8>::with_capacity(capacity);
while let Some(value) = try!(seq.next_element()) { while let Some(value) = try!(seq.next_element()) {
values.push(value); values.push(value);
@@ -936,7 +936,7 @@ macro_rules! seq_impl {
A: SeqAccess<'de>, A: SeqAccess<'de>,
{ {
$clear(&mut self.0); $clear(&mut self.0);
$reserve(&mut self.0, size_hint::cautious($access.size_hint())); $reserve(&mut self.0, size_hint::cautious::<T>($access.size_hint()));
// FIXME: try to overwrite old values here? (Vec, VecDeque, LinkedList) // FIXME: try to overwrite old values here? (Vec, VecDeque, LinkedList)
while let Some(value) = try!($access.next_element()) { while let Some(value) = try!($access.next_element()) {
@@ -962,7 +962,7 @@ seq_impl!(
BinaryHeap<T: Ord>, BinaryHeap<T: Ord>,
seq, seq,
BinaryHeap::clear, BinaryHeap::clear,
BinaryHeap::with_capacity(size_hint::cautious(seq.size_hint())), BinaryHeap::with_capacity(size_hint::cautious::<T>(seq.size_hint())),
BinaryHeap::reserve, BinaryHeap::reserve,
BinaryHeap::push BinaryHeap::push
); );
@@ -992,7 +992,7 @@ seq_impl!(
HashSet<T: Eq + Hash, S: BuildHasher + Default>, HashSet<T: Eq + Hash, S: BuildHasher + Default>,
seq, seq,
HashSet::clear, HashSet::clear,
HashSet::with_capacity_and_hasher(size_hint::cautious(seq.size_hint()), S::default()), HashSet::with_capacity_and_hasher(size_hint::cautious::<T>(seq.size_hint()), S::default()),
HashSet::reserve, HashSet::reserve,
HashSet::insert HashSet::insert
); );
@@ -1002,7 +1002,7 @@ seq_impl!(
VecDeque<T>, VecDeque<T>,
seq, seq,
VecDeque::clear, VecDeque::clear,
VecDeque::with_capacity(size_hint::cautious(seq.size_hint())), VecDeque::with_capacity(size_hint::cautious::<T>(seq.size_hint())),
VecDeque::reserve, VecDeque::reserve,
VecDeque::push_back VecDeque::push_back
); );
@@ -1036,7 +1036,8 @@ where
where where
A: SeqAccess<'de>, A: SeqAccess<'de>,
{ {
let mut values = Vec::with_capacity(size_hint::cautious(seq.size_hint())); let capacity = size_hint::cautious::<T>(seq.size_hint());
let mut values = Vec::<T>::with_capacity(capacity);
while let Some(value) = try!(seq.next_element()) { while let Some(value) = try!(seq.next_element()) {
values.push(value); values.push(value);
@@ -1072,7 +1073,7 @@ where
where where
A: SeqAccess<'de>, A: SeqAccess<'de>,
{ {
let hint = size_hint::cautious(seq.size_hint()); let hint = size_hint::cautious::<T>(seq.size_hint());
if let Some(additional) = hint.checked_sub(self.0.len()) { if let Some(additional) = hint.checked_sub(self.0.len()) {
self.0.reserve(additional); self.0.reserve(additional);
} }
@@ -1416,7 +1417,7 @@ map_impl!(BTreeMap<K: Ord, V>, map, BTreeMap::new());
map_impl!( map_impl!(
HashMap<K: Eq + Hash, V, S: BuildHasher + Default>, HashMap<K: Eq + Hash, V, S: BuildHasher + Default>,
map, map,
HashMap::with_capacity_and_hasher(size_hint::cautious(map.size_hint()), S::default()) HashMap::with_capacity_and_hasher(size_hint::cautious::<(K, V)>(map.size_hint()), S::default())
); );
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
+1 -1
View File
@@ -93,7 +93,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Serde types in rustdoc of other crates get linked to here. // Serde types in rustdoc of other crates get linked to here.
#![doc(html_root_url = "https://docs.rs/serde/1.0.167")] #![doc(html_root_url = "https://docs.rs/serde/1.0.168")]
// Support using Serde without the standard library! // Support using Serde without the standard library!
#![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), no_std)]
// Unstable functionality only if the user asks for it. For tracking and // Unstable functionality only if the user asks for it. For tracking and
+17 -4
View File
@@ -474,7 +474,8 @@ mod content {
where where
V: SeqAccess<'de>, V: SeqAccess<'de>,
{ {
let mut vec = Vec::with_capacity(size_hint::cautious(visitor.size_hint())); let mut vec =
Vec::<Content>::with_capacity(size_hint::cautious::<Content>(visitor.size_hint()));
while let Some(e) = try!(visitor.next_element()) { while let Some(e) = try!(visitor.next_element()) {
vec.push(e); vec.push(e);
} }
@@ -485,7 +486,10 @@ mod content {
where where
V: MapAccess<'de>, V: MapAccess<'de>,
{ {
let mut vec = Vec::with_capacity(size_hint::cautious(visitor.size_hint())); let mut vec =
Vec::<(Content, Content)>::with_capacity(
size_hint::cautious::<(Content, Content)>(visitor.size_hint()),
);
while let Some(kv) = try!(visitor.next_entry()) { while let Some(kv) = try!(visitor.next_entry()) {
vec.push(kv); vec.push(kv);
} }
@@ -844,7 +848,10 @@ mod content {
M: MapAccess<'de>, M: MapAccess<'de>,
{ {
let mut tag = None; let mut tag = None;
let mut vec = Vec::with_capacity(size_hint::cautious(map.size_hint())); let mut vec = Vec::<(Content, Content)>::with_capacity(size_hint::cautious::<(
Content,
Content,
)>(map.size_hint()));
while let Some(k) = try!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) { while let Some(k) = try!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) {
match k { match k {
TagOrContent::Tag => { TagOrContent::Tag => {
@@ -2794,6 +2801,13 @@ where
visitor.visit_unit() visitor.visit_unit()
} }
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_unit()
}
forward_to_deserialize_other! { forward_to_deserialize_other! {
deserialize_bool() deserialize_bool()
deserialize_i8() deserialize_i8()
@@ -2816,7 +2830,6 @@ where
deserialize_tuple(usize) deserialize_tuple(usize)
deserialize_tuple_struct(&'static str, usize) deserialize_tuple_struct(&'static str, usize)
deserialize_identifier() deserialize_identifier()
deserialize_ignored_any()
} }
} }
+11 -3
View File
@@ -8,9 +8,17 @@ where
} }
#[cfg(any(feature = "std", feature = "alloc"))] #[cfg(any(feature = "std", feature = "alloc"))]
#[inline] pub fn cautious<Element>(hint: Option<usize>) -> usize {
pub fn cautious(hint: Option<usize>) -> usize { const MAX_PREALLOC_BYTES: usize = 1024 * 1024;
cmp::min(hint.unwrap_or(0), 4096)
if mem::size_of::<Element>() == 0 {
0
} else {
cmp::min(
hint.unwrap_or(0),
MAX_PREALLOC_BYTES / mem::size_of::<Element>(),
)
}
} }
fn helper(bounds: (usize, Option<usize>)) -> Option<usize> { fn helper(bounds: (usize, Option<usize>)) -> Option<usize> {
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_derive" name = "serde_derive"
version = "1.0.167" # remember to update html_root_url version = "1.0.168" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
categories = ["no-std", "no-std::no-alloc"] categories = ["no-std", "no-std::no-alloc"]
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
+1 -1
View File
@@ -13,7 +13,7 @@
//! //!
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html //! [https://serde.rs/derive.html]: https://serde.rs/derive.html
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.167")] #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.168")]
#![allow(unknown_lints, bare_trait_objects)] #![allow(unknown_lints, bare_trait_objects)]
// Ignored clippy lints // Ignored clippy lints
#![allow( #![allow(
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_test" name = "serde_test"
version = "1.0.167" # remember to update html_root_url version = "1.0.168" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
build = "build.rs" build = "build.rs"
categories = ["development-tools::testing"] categories = ["development-tools::testing"]
+1 -1
View File
@@ -144,7 +144,7 @@
//! # } //! # }
//! ``` //! ```
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.167")] #![doc(html_root_url = "https://docs.rs/serde_test/1.0.168")]
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))] #![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
// Ignored clippy lints // Ignored clippy lints
#![cfg_attr(feature = "cargo-clippy", allow(float_cmp, needless_doctest_main))] #![cfg_attr(feature = "cargo-clippy", allow(float_cmp, needless_doctest_main))]
+26 -1
View File
@@ -10,7 +10,7 @@
clippy::uninlined_format_args, clippy::uninlined_format_args,
)] )]
use serde::de::{self, MapAccess, Unexpected, Visitor}; use serde::de::{self, IgnoredAny, MapAccess, Unexpected, Visitor};
use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::collections::{BTreeMap, HashMap}; use std::collections::{BTreeMap, HashMap};
@@ -2697,6 +2697,31 @@ fn test_flatten_option() {
); );
} }
#[test]
fn test_flatten_ignored_any() {
#[derive(Deserialize, PartialEq, Debug)]
struct Outer {
#[serde(flatten)]
inner: IgnoredAny,
}
assert_de_tokens(
&Outer { inner: IgnoredAny },
&[Token::Map { len: None }, Token::MapEnd],
);
assert_de_tokens(
&Outer { inner: IgnoredAny },
&[
Token::Struct {
name: "DoNotMatter",
len: 0,
},
Token::StructEnd,
],
);
}
#[test] #[test]
fn test_transparent_struct() { fn test_transparent_struct() {
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]