Skip to content

Commit

Permalink
Added try_reserve to VecWriter, Vec, VecDeque and HashMap
Browse files Browse the repository at this point in the history
  • Loading branch information
VictorKoenders committed Feb 1, 2022
1 parent 56ef8d4 commit c1e6e67
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
17 changes: 17 additions & 0 deletions src/error.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
//! Errors that can be encounting by Encoding and Decoding.

#[cfg(feature = "alloc")]
use alloc::collections::TryReserveError;

/// Errors that can be encountered by encoding a type
#[non_exhaustive]
#[derive(Debug)]
Expand Down Expand Up @@ -51,6 +54,13 @@ pub enum EncodeError {
time: std::time::SystemTime,
},

/// bincode failed to allocate enough memory
#[cfg(feature = "alloc")]
OutOfMemory {
/// The inner error
inner: TryReserveError,
},

#[cfg(feature = "serde")]
/// A serde-specific error that occurred while decoding.
Serde(crate::features::serde::EncodeError),
Expand Down Expand Up @@ -168,6 +178,13 @@ pub enum DecodeError {
#[cfg(feature = "serde")]
/// A serde-specific error that occurred while decoding.
Serde(crate::features::serde::DecodeError),

/// bincode failed to allocate enough memory
#[cfg(feature = "alloc")]
OutOfMemory {
/// The inner error
inner: TryReserveError,
},
}

impl core::fmt::Display for DecodeError {
Expand Down
19 changes: 16 additions & 3 deletions src/features/impl_alloc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ impl VecWriter {

impl enc::write::Writer for VecWriter {
fn write(&mut self, bytes: &[u8]) -> Result<(), EncodeError> {
self.inner
.try_reserve(bytes.len())
.map_err(|inner| EncodeError::OutOfMemory { inner })?;
self.inner.extend_from_slice(bytes);
Ok(())
}
Expand All @@ -54,7 +57,11 @@ where
let len = crate::de::decode_slice_len(decoder)?;
decoder.claim_container_read::<T>(len)?;

let mut map = BinaryHeap::with_capacity(len);
let mut map = BinaryHeap::new();
// TODO:
// map.try_reserve(len).map_err(|inner| DecodeError::OutOfMemory { inner })?;
map.reserve(len);

for _ in 0..len {
// See the documentation on `unclaim_bytes_read` as to why we're doing this here
decoder.unclaim_bytes_read(core::mem::size_of::<T>());
Expand Down Expand Up @@ -157,7 +164,10 @@ where
let len = crate::de::decode_slice_len(decoder)?;
decoder.claim_container_read::<T>(len)?;

let mut map = VecDeque::with_capacity(len);
let mut map = VecDeque::new();
map.try_reserve(len)
.map_err(|inner| DecodeError::OutOfMemory { inner })?;

for _ in 0..len {
// See the documentation on `unclaim_bytes_read` as to why we're doing this here
decoder.unclaim_bytes_read(core::mem::size_of::<T>());
Expand Down Expand Up @@ -190,7 +200,10 @@ where
let len = crate::de::decode_slice_len(decoder)?;
decoder.claim_container_read::<T>(len)?;

let mut vec = Vec::with_capacity(len);
let mut vec = Vec::new();
vec.try_reserve(len)
.map_err(|inner| DecodeError::OutOfMemory { inner })?;

for _ in 0..len {
// See the documentation on `unclaim_bytes_read` as to why we're doing this here
decoder.unclaim_bytes_read(core::mem::size_of::<T>());
Expand Down
5 changes: 4 additions & 1 deletion src/features/impl_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,10 @@ where
let len = crate::de::decode_slice_len(decoder)?;
decoder.claim_container_read::<(K, V)>(len)?;

let mut map = HashMap::with_capacity(len);
let mut map = HashMap::new();
map.try_reserve(len)
.map_err(|inner| DecodeError::OutOfMemory { inner })?;

for _ in 0..len {
// See the documentation on `unclaim_bytes_read` as to why we're doing this here
decoder.unclaim_bytes_read(core::mem::size_of::<(K, V)>());
Expand Down

0 comments on commit c1e6e67

Please sign in to comment.