Skip to content
This repository was archived by the owner on Aug 15, 2025. It is now read-only.

Commit b806672

Browse files
Added try_reserve to VecWriter, Vec, VecDeque and HashMap
1 parent fc30eea commit b806672

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

src/error.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
//! Errors that can be encounting by Encoding and Decoding.
22
3+
#[cfg(feature = "alloc")]
4+
use alloc::collections::TryReserveError;
5+
36
/// Errors that can be encountered by encoding a type
47
#[non_exhaustive]
58
#[derive(Debug)]
@@ -54,6 +57,13 @@ pub enum EncodeError {
5457
/// Serde provided bincode with a sequence without a length, which is not supported in bincode
5558
#[cfg(feature = "serde")]
5659
SequenceMustHaveLength,
60+
61+
/// bincode failed to allocate enough memory
62+
#[cfg(feature = "alloc")]
63+
OutOfMemory {
64+
/// The inner error
65+
inner: TryReserveError,
66+
},
5767
}
5868

5969
impl core::fmt::Display for EncodeError {
@@ -139,6 +149,13 @@ pub enum DecodeError {
139149
/// Serde tried decoding a borrowed value from an owned reader. Use `serde_decode_borrowed_from_*` instead
140150
#[cfg(feature = "serde")]
141151
CannotBorrowOwnedData,
152+
153+
/// bincode failed to allocate enough memory
154+
#[cfg(feature = "alloc")]
155+
OutOfMemory {
156+
/// The inner error
157+
inner: TryReserveError,
158+
},
142159
}
143160

144161
impl core::fmt::Display for DecodeError {

src/features/impl_alloc.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ impl VecWriter {
3030

3131
impl enc::write::Writer for VecWriter {
3232
fn write(&mut self, bytes: &[u8]) -> Result<(), EncodeError> {
33+
self.inner
34+
.try_reserve(bytes.len())
35+
.map_err(|inner| EncodeError::OutOfMemory { inner })?;
3336
self.inner.extend_from_slice(bytes);
3437
Ok(())
3538
}
@@ -52,7 +55,11 @@ where
5255
{
5356
fn decode<D: Decoder>(mut decoder: D) -> Result<Self, DecodeError> {
5457
let len = crate::de::decode_slice_len(&mut decoder)?;
55-
let mut map = BinaryHeap::with_capacity(len);
58+
let mut map = BinaryHeap::new();
59+
// TODO:
60+
// map.try_reserve(len).map_err(|inner| DecodeError::OutOfMemory { inner })?;
61+
map.reserve(len);
62+
5663
for _ in 0..len {
5764
let key = T::decode(&mut decoder)?;
5865
map.push(key);
@@ -140,7 +147,9 @@ where
140147
{
141148
fn decode<D: Decoder>(mut decoder: D) -> Result<Self, DecodeError> {
142149
let len = crate::de::decode_slice_len(&mut decoder)?;
143-
let mut map = VecDeque::with_capacity(len);
150+
let mut map = VecDeque::new();
151+
map.try_reserve(len)
152+
.map_err(|inner| DecodeError::OutOfMemory { inner })?;
144153
for _ in 0..len {
145154
let key = T::decode(&mut decoder)?;
146155
map.push_back(key);
@@ -168,7 +177,9 @@ where
168177
{
169178
fn decode<D: Decoder>(mut decoder: D) -> Result<Self, DecodeError> {
170179
let len = crate::de::decode_slice_len(&mut decoder)?;
171-
let mut vec = Vec::with_capacity(len);
180+
let mut vec = Vec::new();
181+
vec.try_reserve(len)
182+
.map_err(|inner| DecodeError::OutOfMemory { inner })?;
172183
for _ in 0..len {
173184
vec.push(T::decode(&mut decoder)?);
174185
}

src/features/impl_std.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,10 @@ where
369369
{
370370
fn decode<D: Decoder>(mut decoder: D) -> Result<Self, DecodeError> {
371371
let len = crate::de::decode_slice_len(&mut decoder)?;
372-
let mut map = HashMap::with_capacity(len);
372+
let mut map = HashMap::new();
373+
map.try_reserve(len)
374+
.map_err(|inner| DecodeError::OutOfMemory { inner })?;
375+
373376
for _ in 0..len {
374377
let k = K::decode(&mut decoder)?;
375378
let v = V::decode(&mut decoder)?;

0 commit comments

Comments
 (0)