summaryrefslogtreecommitdiffstats
path: root/third_party/rust/serde/src/de/size_hint.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/serde/src/de/size_hint.rs')
-rw-r--r--third_party/rust/serde/src/de/size_hint.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/third_party/rust/serde/src/de/size_hint.rs b/third_party/rust/serde/src/de/size_hint.rs
new file mode 100644
index 0000000000..4a4fe25dc5
--- /dev/null
+++ b/third_party/rust/serde/src/de/size_hint.rs
@@ -0,0 +1,29 @@
+use crate::lib::*;
+
+pub fn from_bounds<I>(iter: &I) -> Option<usize>
+where
+ I: Iterator,
+{
+ helper(iter.size_hint())
+}
+
+#[cfg(any(feature = "std", feature = "alloc"))]
+pub fn cautious<Element>(hint: Option<usize>) -> usize {
+ const MAX_PREALLOC_BYTES: usize = 1024 * 1024;
+
+ 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> {
+ match bounds {
+ (lower, Some(upper)) if lower == upper => Some(upper),
+ _ => None,
+ }
+}