diff options
Diffstat (limited to 'common/object/src/value.rs')
| -rw-r--r-- | common/object/src/value.rs | 62 |
1 files changed, 52 insertions, 10 deletions
diff --git a/common/object/src/value.rs b/common/object/src/value.rs index 01b0903..3db7e7c 100644 --- a/common/object/src/value.rs +++ b/common/object/src/value.rs @@ -5,8 +5,9 @@ */ use crate::{Object, ObjectBuffer, Tag}; +use std::borrow::Cow; -pub trait Value<'a>: ValueStore + Sized { +pub trait ValueLoad<'a>: ValueStore + Sized { const ALIGNED: bool; fn load_aligned(buf: &'a [u32]) -> Option<Self> { let _ = buf; @@ -53,13 +54,54 @@ impl ValueType { } } +#[derive(Debug, Clone)] +pub enum Value<'a> { + Tag(Tag), + U32(u32), + U64(u64), + I64(i64), + String(Cow<'a, str>), + Binary(Cow<'a, [u8]>), +} + +impl<'a> From<&'a str> for Value<'a> { + fn from(value: &'a str) -> Self { + Self::String(value.into()) + } +} +impl From<String> for Value<'static> { + fn from(value: String) -> Self { + Self::String(value.into()) + } +} +impl From<u32> for Value<'static> { + fn from(value: u32) -> Self { + Self::U32(value) + } +} +impl From<u64> for Value<'static> { + fn from(value: u64) -> Self { + Self::U64(value) + } +} +impl From<i64> for Value<'static> { + fn from(value: i64) -> Self { + Self::I64(value) + } +} +impl From<Tag> for Value<'static> { + fn from(value: Tag) -> Self { + Self::Tag(value) + } +} + pub trait ValueStore { fn get_type(&self) -> ValueType; fn store_aligned(&self, _buf: &mut Vec<u32>) {} fn store_unaligned(&self, _buf: &mut Vec<u8>) {} fn size(&self) -> usize; } -impl<'a> Value<'a> for &'a str { +impl<'a> ValueLoad<'a> for &'a str { const ALIGNED: bool = false; fn load_unaligned(buf: &'a [u8]) -> Option<Self> { str::from_utf8(buf).ok() @@ -76,7 +118,7 @@ impl ValueStore for &str { self.len() } } -impl Value<'_> for u32 { +impl ValueLoad<'_> for u32 { const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option<Self> { buf.get(0).copied().map(u32::from_be) @@ -93,7 +135,7 @@ impl ValueStore for u32 { 4 } } -impl Value<'_> for Tag { +impl ValueLoad<'_> for Tag { const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option<Self> { buf.get(0).copied().map(u32::from_be).map(Tag) @@ -110,7 +152,7 @@ impl ValueStore for Tag { 4 } } -impl Value<'_> for u64 { +impl ValueLoad<'_> for u64 { const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option<Self> { let hi = u32::from_be(*buf.get(0)?) as u64; @@ -130,7 +172,7 @@ impl ValueStore for u64 { 8 } } -impl Value<'_> for f64 { +impl ValueLoad<'_> for f64 { const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option<Self> { if buf.len() < 2 { @@ -156,7 +198,7 @@ impl ValueStore for f64 { 8 } } -impl Value<'_> for i64 { +impl ValueLoad<'_> for i64 { const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option<Self> { u64::load_aligned(buf).map(|x| x as i64) @@ -173,7 +215,7 @@ impl ValueStore for i64 { 8 } } -impl<'a> Value<'a> for Object<'a> { +impl<'a> ValueLoad<'a> for Object<'a> { const ALIGNED: bool = true; fn load_aligned(buf: &'a [u32]) -> Option<Self> { Self::load(buf) @@ -204,7 +246,7 @@ impl ValueStore for ObjectBuffer { self.0.len() * 4 } } -impl<'a> Value<'a> for &'a [u8] { +impl<'a> ValueLoad<'a> for &'a [u8] { const ALIGNED: bool = false; fn load_unaligned(buf: &'a [u8]) -> Option<Self> { Some(buf) @@ -221,7 +263,7 @@ impl ValueStore for &[u8] { self.len() } } -impl<'a> Value<'a> for () { +impl<'a> ValueLoad<'a> for () { const ALIGNED: bool = true; fn load_aligned(_buf: &'a [u32]) -> Option<Self> { Some(()) |