Implement world viewer with support for OBJ worlds
This commit is contained in:
+21
-7
@@ -1,6 +1,7 @@
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
fmt::Debug,
|
||||
iter::FusedIterator,
|
||||
sync::{atomic::AtomicU64, Arc, Mutex, RwLock, RwLockReadGuard, TryLockError, Weak},
|
||||
};
|
||||
|
||||
@@ -117,7 +118,6 @@ impl<const N: usize, T: MemoryValue> MemoryValue for [T; N] {
|
||||
|
||||
pub struct MemoryIter<'a, T> {
|
||||
bytes: &'a [u8],
|
||||
index: usize,
|
||||
_phantom: std::marker::PhantomData<T>,
|
||||
}
|
||||
|
||||
@@ -125,7 +125,6 @@ impl<'a, T> MemoryIter<'a, T> {
|
||||
fn new(bytes: &'a [u8]) -> Self {
|
||||
Self {
|
||||
bytes,
|
||||
index: 0,
|
||||
_phantom: std::marker::PhantomData,
|
||||
}
|
||||
}
|
||||
@@ -136,15 +135,30 @@ impl<T: MemoryValue> Iterator for MemoryIter<'_, T> {
|
||||
|
||||
#[inline]
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
if self.index >= self.bytes.len() {
|
||||
return None;
|
||||
}
|
||||
let bytes = &self.bytes[self.index..self.index + std::mem::size_of::<T>()];
|
||||
self.index += std::mem::size_of::<T>();
|
||||
let (bytes, rest) = self.bytes.split_at_checked(std::mem::size_of::<T>())?;
|
||||
self.bytes = rest;
|
||||
Some(T::from_bytes(bytes))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
let size = self.bytes.len() / std::mem::size_of::<T>();
|
||||
(size, Some(size))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: MemoryValue> DoubleEndedIterator for MemoryIter<'_, T> {
|
||||
fn next_back(&mut self) -> Option<Self::Item> {
|
||||
let mid = self.bytes.len().checked_sub(std::mem::size_of::<T>())?;
|
||||
// SAFETY: the checked_sub above is effectively a bounds check
|
||||
let (rest, bytes) = unsafe { self.bytes.split_at_unchecked(mid) };
|
||||
self.bytes = rest;
|
||||
Some(T::from_bytes(bytes))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: MemoryValue> FusedIterator for MemoryIter<'_, T> {}
|
||||
|
||||
impl MemoryRef<'_> {
|
||||
pub fn read<T: MemoryValue>(&self, index: usize) -> T {
|
||||
let from = index * size_of::<T>();
|
||||
|
||||
Reference in New Issue
Block a user