aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/object/src/lib.rs15
-rw-r--r--common/object/src/value.rs22
2 files changed, 21 insertions, 16 deletions
diff --git a/common/object/src/lib.rs b/common/object/src/lib.rs
index a73de08..98e4834 100644
--- a/common/object/src/lib.rs
+++ b/common/object/src/lib.rs
@@ -160,7 +160,7 @@ impl<'a> Object<'a> {
}
#[inline]
pub fn get_typed<T: ValueLoad<'a>>(&self, index: usize) -> Option<T> {
- if T::ALIGNED {
+ if T::TYPE.is_aligned() {
T::load_aligned(self.get_aligned(index)?)
} else {
T::load_unaligned(self.get_unaligned(index)?)
@@ -326,13 +326,18 @@ pub struct EntriesIter<'a, T> {
impl<'a, T: ValueLoad<'a>> Iterator for EntriesIter<'a, T> {
type Item = (Tag, T);
fn next(&mut self) -> Option<Self::Item> {
- if self.index >= self.object.tags.len() {
- return None;
- } else {
+ loop {
+ if self.index >= self.object.tags.len() {
+ return None;
+ }
+ if T::TYPE != self.object.offset_type(self.index) {
+ self.index += 1;
+ continue;
+ }
let value = self.object.get_typed(self.index)?;
let tag = self.object.tags[self.index];
self.index += 1;
- Some((Tag(tag), value))
+ return Some((Tag(tag), value));
}
}
}
diff --git a/common/object/src/value.rs b/common/object/src/value.rs
index 8371a79..9b9a438 100644
--- a/common/object/src/value.rs
+++ b/common/object/src/value.rs
@@ -8,7 +8,7 @@ use crate::{Object, ObjectBuffer, Tag};
use std::{borrow::Cow, fmt::Display, str::FromStr};
pub trait ValueLoad<'a>: ValueStore + Sized {
- const ALIGNED: bool;
+ const TYPE: ValueType;
fn load_aligned(buf: &'a [u32]) -> Option<Self> {
let _ = buf;
unimplemented!()
@@ -33,7 +33,7 @@ pub enum ValueType {
impl ValueType {
#[inline]
- pub fn is_aligned(self) -> bool {
+ pub const fn is_aligned(self) -> bool {
match self {
ValueType::Binary | ValueType::String => false,
_ => true,
@@ -133,7 +133,7 @@ pub trait ValueStore {
fn size(&self) -> usize;
}
impl<'a> ValueLoad<'a> for &'a str {
- const ALIGNED: bool = false;
+ const TYPE: ValueType = ValueType::String;
fn load_unaligned(buf: &'a [u8]) -> Option<Self> {
str::from_utf8(buf).ok()
}
@@ -150,7 +150,7 @@ impl ValueStore for &str {
}
}
impl ValueLoad<'_> for u32 {
- const ALIGNED: bool = true;
+ const TYPE: ValueType = ValueType::UInt;
fn load_aligned(buf: &[u32]) -> Option<Self> {
buf.get(0).copied().map(u32::from_be)
}
@@ -167,7 +167,7 @@ impl ValueStore for u32 {
}
}
impl ValueLoad<'_> for Tag {
- const ALIGNED: bool = true;
+ const TYPE: ValueType = ValueType::Tag;
fn load_aligned(buf: &[u32]) -> Option<Self> {
buf.get(0).copied().map(u32::from_be).map(Tag)
}
@@ -184,7 +184,7 @@ impl ValueStore for Tag {
}
}
impl ValueLoad<'_> for u64 {
- const ALIGNED: bool = true;
+ const TYPE: ValueType = ValueType::UInt;
fn load_aligned(buf: &[u32]) -> Option<Self> {
let hi = u32::from_be(*buf.get(0)?) as u64;
let lo = u32::from_be(*buf.get(1)?) as u64;
@@ -204,7 +204,7 @@ impl ValueStore for u64 {
}
}
impl ValueLoad<'_> for f64 {
- const ALIGNED: bool = true;
+ const TYPE: ValueType = ValueType::Float;
fn load_aligned(buf: &[u32]) -> Option<Self> {
if buf.len() < 2 {
return None;
@@ -230,7 +230,7 @@ impl ValueStore for f64 {
}
}
impl ValueLoad<'_> for i64 {
- const ALIGNED: bool = true;
+ const TYPE: ValueType = ValueType::Int;
fn load_aligned(buf: &[u32]) -> Option<Self> {
u64::load_aligned(buf).map(|x| x as i64)
}
@@ -247,7 +247,7 @@ impl ValueStore for i64 {
}
}
impl<'a> ValueLoad<'a> for Object<'a> {
- const ALIGNED: bool = true;
+ const TYPE: ValueType = ValueType::Object;
fn load_aligned(buf: &'a [u32]) -> Option<Self> {
Self::load(buf)
}
@@ -278,7 +278,7 @@ impl ValueStore for ObjectBuffer {
}
}
impl<'a> ValueLoad<'a> for &'a [u8] {
- const ALIGNED: bool = false;
+ const TYPE: ValueType = ValueType::Binary;
fn load_unaligned(buf: &'a [u8]) -> Option<Self> {
Some(buf)
}
@@ -295,7 +295,7 @@ impl ValueStore for &[u8] {
}
}
impl<'a> ValueLoad<'a> for () {
- const ALIGNED: bool = true;
+ const TYPE: ValueType = ValueType::Int;
fn load_aligned(_buf: &'a [u32]) -> Option<Self> {
Some(())
}