aboutsummaryrefslogtreecommitdiff
path: root/common/object/src/value.rs
diff options
context:
space:
mode:
Diffstat (limited to 'common/object/src/value.rs')
-rw-r--r--common/object/src/value.rs62
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(())