From 7d82983ce52f989958bdc368b288925a7d8b8890 Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 9 Jul 2023 15:48:39 +0000 Subject: [PATCH] `atomic::array` --- src/rstd/atomic.rs | 1 + src/rstd/atomic/array.rs | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/rstd/atomic/array.rs diff --git a/src/rstd/atomic.rs b/src/rstd/atomic.rs index b5a645d..a5cfe1c 100644 --- a/src/rstd/atomic.rs +++ b/src/rstd/atomic.rs @@ -1,6 +1,7 @@ //! This module allows to describe a primitive subset of [Mentionable] types, [Atomic]s, //! simple static types, which are completely [Context]-independent. +pub mod array; pub mod atomic_object; pub mod au64; pub mod boolean; diff --git a/src/rstd/atomic/array.rs b/src/rstd/atomic/array.rs new file mode 100644 index 0000000..6cee1a0 --- /dev/null +++ b/src/rstd/atomic/array.rs @@ -0,0 +1,61 @@ +use crate::rstd::inlining::*; + +use super::*; + +impl Serializable for [u8; N] { + fn serialize(&self, serializer: &mut dyn Serializer) { + serializer.write(self) + } +} + +#[derive(Debug, PartialEq)] +pub enum ArrayParseError { + Eof, + ExtraData(usize), +} + +impl Display for ArrayParseError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Eof => write!(f, "encountered EOF write parsing an array."), + Self::ExtraData(length) => write!( + f, + "encountered extra data of length {length} while parsing an array.", + ), + } + } +} + +impl Error for ArrayParseError {} + +impl From<&[u8]> for ArrayParseError { + fn from(_value: &[u8]) -> Self { + Self::Eof + } +} + +impl Atomic for [u8; N] { + type AParseError = ArrayParseError; + + fn a_deserialize(inlining: impl Inlining) -> AParseResult { + Self::a_ideserialize(inlining).seal() + } + + fn a_extend(self, tail: &[u8]) -> AParseResult { + Err(Self::a_extension_error(tail)) + } +} + +impl InlineableAtomic for [u8; N] { + fn a_extension_error(tail: &[u8]) -> Self::AParseError { + ArrayParseError::ExtraData(tail.len()) + } + + fn a_ideserialize(inlining: D) -> ADParseResult { + inlining.iread_n_const::(|slice| ArrayParseError::from(slice)) + } +} + +impl ConstSizeAtomic for [u8; N] { + const SIZE: usize = N; +}