From 5baf4bf4ad206c5f704eae4e32842e4d6268c8c1 Mon Sep 17 00:00:00 2001 From: timofey Date: Wed, 28 Jun 2023 16:11:47 +0000 Subject: [PATCH] `InlineableAtomic::a_ideserialize` --- src/rstd/atomic/au64.rs | 6 ++++++ src/rstd/atomic/boolean.rs | 10 ++++++++++ src/rstd/inlining.rs | 2 ++ 3 files changed, 18 insertions(+) diff --git a/src/rstd/atomic/au64.rs b/src/rstd/atomic/au64.rs index bd4555a..84ba8be 100644 --- a/src/rstd/atomic/au64.rs +++ b/src/rstd/atomic/au64.rs @@ -50,6 +50,12 @@ impl InlineableAtomic for u64 { fn a_extension_error(tail: &[u8]) -> Self::AParseError { IntParseError::ExtraData(tail.len()) } + + fn a_ideserialize(deserializer: D) -> ADParseResult { + let (x, deserializer) = + deserializer.iread_n_const::<8>(|slice| IntParseError::from(slice))?; + Ok((u64::from_le_bytes(x), deserializer)) + } } impl ConstSizeAtomic for u64 { diff --git a/src/rstd/atomic/boolean.rs b/src/rstd/atomic/boolean.rs index 2422201..bc06d6e 100644 --- a/src/rstd/atomic/boolean.rs +++ b/src/rstd/atomic/boolean.rs @@ -62,6 +62,16 @@ impl InlineableAtomic for bool { fn a_extension_error(tail: &[u8]) -> Self::AParseError { BooleanParseError::ExtraData(tail.len()) } + + fn a_ideserialize(deserializer: D) -> ADParseResult { + let (byte, deserializer) = + deserializer.iread_n_const::<1>(|slice| BooleanParseError::from(slice))?; + match byte[0] { + 0 => Ok((false, deserializer)), + 1 => Ok((true, deserializer)), + value => Err(BooleanParseError::OutOfBounds(value)), + } + } } impl ConstSizeAtomic for bool { diff --git a/src/rstd/inlining.rs b/src/rstd/inlining.rs index 359cdc7..d6e8a13 100644 --- a/src/rstd/inlining.rs +++ b/src/rstd/inlining.rs @@ -117,6 +117,8 @@ pub type ADParseResult = Result<(A, D), ::AParseError>; /// Atomic analogue of [`InlineableFactory`]/[`InlineableObject`]. pub trait InlineableAtomic: Atomic { fn a_extension_error(tail: &[u8]) -> Self::AParseError; + + fn a_ideserialize(deserializer: D) -> ADParseResult; } /// Atomic analogue of [`ConstSizeFactory`]/[`ConstSizeObject`].