diff --git a/src/rstd/atomic.rs b/src/rstd/atomic.rs index 822aec7..7a506a5 100644 --- a/src/rstd/atomic.rs +++ b/src/rstd/atomic.rs @@ -2,6 +2,7 @@ //! simple static types, which are completely [Context]-independent. pub mod atomic_object; +pub mod au64; pub mod boolean; pub mod plain; diff --git a/src/rstd/atomic/au64.rs b/src/rstd/atomic/au64.rs new file mode 100644 index 0000000..cfae36f --- /dev/null +++ b/src/rstd/atomic/au64.rs @@ -0,0 +1,50 @@ +use crate::rstd::inlining::*; + +use super::*; + +impl Serializable for u64 { + fn serialize(&self, serializer: &mut dyn Serializer) { + serializer.write(&self.to_le_bytes()); + } +} + +#[derive(Debug, PartialEq)] +pub enum IntParseError { + Eof, + ExtraData(usize), +} + +impl Display for IntParseError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Eof => f.write_fmt(format_args!("encountered EOF write parsing an integer.")), + Self::ExtraData(length) => f.write_fmt(format_args!( + "encountered extra data of length {length} while parsing an integer.", + )), + } + } +} + +impl Error for IntParseError {} + +impl From<&[u8]> for IntParseError { + fn from(_value: &[u8]) -> Self { + Self::Eof + } +} + +impl Atomic for u64 { + type AParseError = IntParseError; + + fn a_deserialize(deserializer: &mut dyn Deserializer) -> Result { + Ok(u64::from_le_bytes(deserializer.read_n_const::<8>()?)) + } + + fn a_unexpected_tail(tail: &[u8]) -> Self::AParseError { + IntParseError::ExtraData(tail.len()) + } +} + +impl ConstSizeAtomic for u64 { + const SIZE: usize = 8; +}