mod not;
mod or;
mod tracking;
use crate::component::Component;
use crate::entity_id::EntityId;
use crate::iter::ShiperatorOutput;
use crate::optional::Optional;
use crate::r#mut::Mut;
use crate::sparse_set::{FullRawWindow, FullRawWindowMut};
use crate::track;
pub trait ShiperatorCaptain: ShiperatorOutput {
unsafe fn get_captain_data(&self, index: usize) -> Self::Out;
fn next_slice(&mut self);
fn sail_time(&self) -> usize;
fn is_exact_sized(&self) -> bool;
fn unpick(&mut self);
}
impl<'tmp, T: Component> ShiperatorCaptain for FullRawWindow<'tmp, T> {
#[inline]
unsafe fn get_captain_data(&self, index: usize) -> Self::Out {
&*self.data.add(index)
}
#[inline]
fn next_slice(&mut self) {}
#[inline]
fn sail_time(&self) -> usize {
self.dense_len
}
#[inline]
fn is_exact_sized(&self) -> bool {
true
}
#[inline]
fn unpick(&mut self) {}
}
macro_rules! impl_shiperator_captain_no_mut {
($($track: path)+) => {
$(
impl<'tmp, T: Component> ShiperatorCaptain for FullRawWindowMut<'tmp, T, $track> {
#[inline]
unsafe fn get_captain_data(&self, index: usize) -> Self::Out {
&mut *self.data.add(index)
}
#[inline]
fn next_slice(&mut self) {}
#[inline]
fn sail_time(&self) -> usize {
self.dense_len
}
#[inline]
fn is_exact_sized(&self) -> bool {
true
}
#[inline]
fn unpick(&mut self) {}
}
)+
}
}
impl_shiperator_captain_no_mut![track::Untracked track::Insertion track::InsertionAndDeletion track::InsertionAndRemoval track::InsertionAndDeletionAndRemoval track::Deletion track::DeletionAndRemoval track::Removal];
macro_rules! impl_shiperator_captain_mut {
($($track: path)+) => {
$(
impl<'tmp, T: Component> ShiperatorCaptain for FullRawWindowMut<'tmp, T, $track> {
#[inline]
unsafe fn get_captain_data(&self, index: usize) -> Self::Out {
Mut {
flag: Some(&mut *self.modification_data.add(index)),
current: self.current,
data: &mut *self.data.add(index),
}
}
#[inline]
fn next_slice(&mut self) {}
#[inline]
fn sail_time(&self) -> usize {
self.dense_len
}
#[inline]
fn is_exact_sized(&self) -> bool {
true
}
#[inline]
fn unpick(&mut self) {}
}
)+
}
}
impl_shiperator_captain_mut![track::Modification track::InsertionAndModification track::InsertionAndModificationAndDeletion track::InsertionAndModificationAndRemoval track::ModificationAndDeletion track::ModificationAndRemoval track::ModificationAndDeletionAndRemoval track::All];
impl<'tmp> ShiperatorCaptain for &'tmp [EntityId] {
unsafe fn get_captain_data(&self, index: usize) -> Self::Out {
*self.get_unchecked(index)
}
fn next_slice(&mut self) {}
fn sail_time(&self) -> usize {
self.len()
}
fn is_exact_sized(&self) -> bool {
false
}
fn unpick(&mut self) {}
}
impl<'tmp, T: Component> ShiperatorCaptain for Optional<FullRawWindow<'tmp, T>> {
unsafe fn get_captain_data(&self, _index: usize) -> Self::Out {
unreachable!()
}
fn next_slice(&mut self) {}
fn sail_time(&self) -> usize {
self.0.sail_time()
}
fn is_exact_sized(&self) -> bool {
false
}
fn unpick(&mut self) {}
}
impl<'tmp, T: Component, Track> ShiperatorCaptain for Optional<FullRawWindowMut<'tmp, T, Track>>
where
Optional<FullRawWindowMut<'tmp, T, Track>>: ShiperatorOutput,
FullRawWindowMut<'tmp, T, Track>: ShiperatorCaptain,
{
unsafe fn get_captain_data(&self, _index: usize) -> Self::Out {
unreachable!()
}
fn next_slice(&mut self) {}
fn sail_time(&self) -> usize {
self.0.sail_time()
}
fn is_exact_sized(&self) -> bool {
false
}
fn unpick(&mut self) {}
}