shipyard 0.11.2

Entity Component System
Documentation
use crate::component::Component;
use crate::entity_id::EntityId;
use crate::iter::ShiperatorSailor;
use crate::not::Not;
use crate::sparse_set::{FullRawWindow, FullRawWindowMut};
use crate::track;
use crate::tracking::{Inserted, InsertedOrModified, Modified};

impl<'tmp, T: Component> ShiperatorSailor for Not<FullRawWindow<'tmp, T>> {
    type Index = usize;

    #[inline]
    unsafe fn get_sailor_data(&self, _index: Self::Index) -> Self::Out {}

    #[inline]
    fn indices_of(&self, eid: EntityId, _: usize) -> Option<Self::Index> {
        if self.0.index_of(eid).is_some() {
            None
        } else {
            Some(usize::MAX)
        }
    }

    #[inline]
    fn index_from_usize(index: usize) -> Self::Index {
        index
    }
}

impl<'tmp, T: Component, Track> ShiperatorSailor for Not<FullRawWindowMut<'tmp, T, Track>> {
    type Index = usize;

    #[inline]
    unsafe fn get_sailor_data(&self, _index: Self::Index) -> Self::Out {}

    #[inline]
    fn indices_of(&self, eid: EntityId, _: usize) -> Option<Self::Index> {
        if self.0.index_of(eid).is_some() {
            None
        } else {
            Some(usize::MAX)
        }
    }

    #[inline]
    fn index_from_usize(index: usize) -> Self::Index {
        index
    }
}

impl<'tmp, T: Component> ShiperatorSailor for Not<Inserted<FullRawWindow<'tmp, T>>> {
    type Index = usize;

    #[inline]
    unsafe fn get_sailor_data(&self, index: Self::Index) -> Self::Out {
        (self.0).0.get_sailor_data(index)
    }

    #[inline]
    fn indices_of(&self, eid: EntityId, _: usize) -> Option<Self::Index> {
        let Some(index) = (self.0).0.index_of(eid) else {
            return None;
        };

        if unsafe { *(self.0).0.insertion_data.add(index) }
            .is_within((self.0).0.last_insertion, (self.0).0.current)
        {
            None
        } else {
            Some(index)
        }
    }

    #[inline]
    fn index_from_usize(index: usize) -> Self::Index {
        index
    }
}

macro_rules! impl_shiperator_sailor_not_inserted {
    ($($track: path)+) => {
        $(
            impl<'tmp, T: Component> ShiperatorSailor for Not<Inserted<FullRawWindowMut<'tmp, T, $track>>> {
                type Index = usize;

                #[inline]
                unsafe fn get_sailor_data(&self, index: Self::Index) -> Self::Out {
                    (self.0).0.get_sailor_data(index)
                }

                #[inline]
                fn indices_of(&self, eid: EntityId, _: usize, ) -> Option<Self::Index> {
                    let Some(index) = (self.0).0.index_of(eid) else {
                        return None;
                    };

                    if unsafe { *(self.0).0.insertion_data.add(index) }
                        .is_within((self.0).0.last_insertion, (self.0).0.current)
                    {
                        None
                    } else {
                        Some(index)
                    }
                }

                #[inline]
                fn index_from_usize(index: usize) -> Self::Index {
                    index
                }
            }
        )+
    }
}

impl_shiperator_sailor_not_inserted![track::Untracked track::Insertion track::InsertionAndDeletion track::InsertionAndRemoval track::InsertionAndDeletionAndRemoval track::Deletion track::DeletionAndRemoval track::Removal];
impl_shiperator_sailor_not_inserted![track::Modification track::InsertionAndModification track::InsertionAndModificationAndDeletion track::InsertionAndModificationAndRemoval track::ModificationAndDeletion track::ModificationAndRemoval track::ModificationAndDeletionAndRemoval track::All];

impl<'tmp, T: Component> ShiperatorSailor for Not<Modified<FullRawWindow<'tmp, T>>> {
    type Index = usize;

    #[inline]
    unsafe fn get_sailor_data(&self, index: Self::Index) -> Self::Out {
        &*(self.0).0.data.add(index)
    }

    #[inline]
    fn indices_of(&self, eid: EntityId, _: usize) -> Option<Self::Index> {
        let Some(index) = (self.0).0.index_of(eid) else {
            return None;
        };

        if unsafe { *(self.0).0.modification_data.add(index) }
            .is_within((self.0).0.last_modification, (self.0).0.current)
        {
            None
        } else {
            Some(index)
        }
    }

    #[inline]
    fn index_from_usize(index: usize) -> Self::Index {
        index
    }
}

macro_rules! impl_shiperator_sailor_not_modified {
    ($($track: path)+) => {
        $(
            impl<'tmp, T: Component> ShiperatorSailor for Not<Modified<FullRawWindowMut<'tmp, T, $track>>> {
                type Index = usize;

                #[inline]
                unsafe fn get_sailor_data(&self, index: Self::Index) -> Self::Out {
                    (self.0).0.get_sailor_data(index)
                }

                #[inline]
                fn indices_of(&self, eid: EntityId, _: usize, ) -> Option<Self::Index> {
                    let Some(index) = (self.0).0.index_of(eid) else {
                        return None;
                    };

                    if unsafe { *(self.0).0.modification_data.add(index) }
                        .is_within((self.0).0.last_modification, (self.0).0.current)
                    {
                        None
                    } else {
                        Some(index)
                    }
                }

                #[inline]
                fn index_from_usize(index: usize) -> Self::Index {
                    index
                }
            }
        )+
    }
}

impl_shiperator_sailor_not_modified![track::Untracked track::Insertion track::InsertionAndDeletion track::InsertionAndRemoval track::InsertionAndDeletionAndRemoval track::Deletion track::DeletionAndRemoval track::Removal];
impl_shiperator_sailor_not_modified![track::Modification track::InsertionAndModification track::InsertionAndModificationAndDeletion track::InsertionAndModificationAndRemoval track::ModificationAndDeletion track::ModificationAndRemoval track::ModificationAndDeletionAndRemoval track::All];

impl<'tmp, T: Component> ShiperatorSailor for Not<InsertedOrModified<FullRawWindow<'tmp, T>>> {
    type Index = usize;

    #[inline]
    unsafe fn get_sailor_data(&self, index: Self::Index) -> Self::Out {
        &*(self.0).0.data.add(index)
    }

    #[inline]
    fn indices_of(&self, eid: EntityId, _: usize) -> Option<Self::Index> {
        let Some(index) = (self.0).0.index_of(eid) else {
            return None;
        };

        if unsafe { *(self.0).0.insertion_data.add(index) }
            .is_within((self.0).0.last_insertion, (self.0).0.current)
            || unsafe { *(self.0).0.modification_data.add(index) }
                .is_within((self.0).0.last_modification, (self.0).0.current)
        {
            None
        } else {
            Some(index)
        }
    }

    #[inline]
    fn index_from_usize(index: usize) -> Self::Index {
        index
    }
}

macro_rules! impl_shiperator_sailor_not_inserted_or_modified {
    ($($track: path)+) => {
        $(
            impl<'tmp, T: Component> ShiperatorSailor for Not<InsertedOrModified<FullRawWindowMut<'tmp, T, $track>>> {
                type Index = usize;

                #[inline]
                unsafe fn get_sailor_data(&self, index: Self::Index) -> Self::Out {
                    (self.0).0.get_sailor_data(index)
                }

                #[inline]
                fn indices_of(&self, eid: EntityId, _: usize, ) -> Option<Self::Index> {
                    let Some(index) = (self.0).0.index_of(eid) else {
                        return None;
                    };

                    if unsafe { *(self.0).0.insertion_data.add(index) }
                        .is_within((self.0).0.last_insertion, (self.0).0.current)
                        || unsafe { *(self.0).0.modification_data.add(index) }
                        .is_within((self.0).0.last_modification, (self.0).0.current)
                    {
                        None
                    } else {
                        Some(index)
                    }
                }

                #[inline]
                fn index_from_usize(index: usize) -> Self::Index {
                    index
                }
            }
        )+
    }
}

impl_shiperator_sailor_not_inserted_or_modified![track::Untracked track::Insertion track::InsertionAndDeletion track::InsertionAndRemoval track::InsertionAndDeletionAndRemoval track::Deletion track::DeletionAndRemoval track::Removal];
impl_shiperator_sailor_not_inserted_or_modified![track::Modification track::InsertionAndModification track::InsertionAndModificationAndDeletion track::InsertionAndModificationAndRemoval track::ModificationAndDeletion track::ModificationAndRemoval track::ModificationAndDeletionAndRemoval track::All];