shipyard 0.11.2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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