use rkyv::{Archive, Archived};
use std::ops::Deref;
use crate::instance::InstanceVersion;
use crate::state::State;
use crate::synchronizer::SynchronizerError;
pub(crate) struct ReadGuard<'a> {
state: &'a mut State,
version: InstanceVersion,
}
impl<'a> ReadGuard<'a> {
pub(crate) fn new(
state: &'a mut State,
version: InstanceVersion,
) -> Result<Self, SynchronizerError> {
state.rlock(version);
Ok(ReadGuard { version, state })
}
}
impl<'a> Drop for ReadGuard<'a> {
fn drop(&mut self) {
self.state.runlock(self.version);
}
}
pub struct ReadResult<'a, T: Archive> {
_guard: ReadGuard<'a>,
entity: &'a Archived<T>,
switched: bool,
}
impl<'a, T: Archive> ReadResult<'a, T> {
pub(crate) fn new(_guard: ReadGuard<'a>, entity: &'a Archived<T>, switched: bool) -> Self {
ReadResult {
_guard,
entity,
switched,
}
}
pub fn is_switched(&self) -> bool {
self.switched
}
}
impl<'a, T: Archive> Deref for ReadResult<'a, T> {
type Target = Archived<T>;
fn deref(&self) -> &Archived<T> {
self.entity
}
}