diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/object/src/lib.rs | 15 | ||||
| -rw-r--r-- | common/object/src/value.rs | 22 |
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(()) } |