Skip to content

Commit

Permalink
Implement ser/de for reference count types (#27)
Browse files Browse the repository at this point in the history
* Implement ser/de for reference count types

* fmt
  • Loading branch information
austinabell committed Apr 7, 2021
1 parent 3223286 commit eff33a6
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 0 deletions.
1 change: 1 addition & 0 deletions borsh/Cargo.toml
Expand Up @@ -27,3 +27,4 @@ hashbrown = "0.9.1"
[features]
default = ["std"]
std = []
rc = []
27 changes: 27 additions & 0 deletions borsh/src/de/mod.rs
Expand Up @@ -14,6 +14,9 @@ use crate::maybestd::{
vec::Vec,
};

#[cfg(feature = "rc")]
use std::{rc::Rc, sync::Arc};

mod hint;

const ERROR_NOT_ALL_BYTES_READ: &str = "Not all bytes read";
Expand Down Expand Up @@ -556,3 +559,27 @@ impl_tuple!(T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16);
impl_tuple!(T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17);
impl_tuple!(T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17 T18);
impl_tuple!(T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17 T18 T19);

#[cfg(feature = "rc")]
impl<T, U> BorshDeserialize for Rc<T>
where
U: Into<Rc<T>> + Borrow<T>,
T: ToOwned<Owned = U> + ?Sized,
T::Owned: BorshDeserialize,
{
fn deserialize(buf: &mut &[u8]) -> Result<Self> {
Ok(T::Owned::deserialize(buf)?.into())
}
}

#[cfg(feature = "rc")]
impl<T, U> BorshDeserialize for Arc<T>
where
U: Into<Arc<T>> + Borrow<T>,
T: ToOwned<Owned = U> + ?Sized,
T::Owned: BorshDeserialize,
{
fn deserialize(buf: &mut &[u8]) -> Result<Self> {
Ok(T::Owned::deserialize(buf)?.into())
}
}
17 changes: 17 additions & 0 deletions borsh/src/ser/mod.rs
Expand Up @@ -10,6 +10,9 @@ use crate::maybestd::{
vec::Vec,
};

#[cfg(feature = "rc")]
use std::{rc::Rc, sync::Arc};

const DEFAULT_SERIALIZER_CAPACITY: usize = 1024;

/// A data-structure that can be serialized into binary format by NBOR.
Expand Down Expand Up @@ -463,3 +466,17 @@ impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T
impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17);
impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18);
impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19);

#[cfg(feature = "rc")]
impl<T: BorshSerialize + ?Sized> BorshSerialize for Rc<T> {
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
(**self).serialize(writer)
}
}

#[cfg(feature = "rc")]
impl<T: BorshSerialize + ?Sized> BorshSerialize for Arc<T> {
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
(**self).serialize(writer)
}
}
20 changes: 20 additions & 0 deletions borsh/tests/test_rc.rs
@@ -0,0 +1,20 @@
#![cfg(feature = "rc")]

use borsh::{BorshDeserialize, BorshSerialize};
use std::{rc::Rc, sync::Arc};

#[test]
fn test_rc_roundtrip() {
let value = Rc::new(8u8);
let serialized = value.try_to_vec().unwrap();
let deserialized = Rc::<u8>::try_from_slice(&serialized).unwrap();
assert_eq!(value, deserialized);
}

#[test]
fn test_arc_roundtrip() {
let value = Arc::new(8u8);
let serialized = value.try_to_vec().unwrap();
let deserialized = Arc::<u8>::try_from_slice(&serialized).unwrap();
assert_eq!(value, deserialized);
}

0 comments on commit eff33a6

Please sign in to comment.