mod blob_array;
mod resource;
mod sparse_set;
mod table;
mod thin_array_ptr;
pub use resource::*;
pub use sparse_set::*;
pub use table::*;
use crate::component::{ComponentInfo, StorageType};
use alloc::vec::Vec;
#[derive(Default)]
pub struct Storages {
pub sparse_sets: SparseSets,
pub tables: Tables,
pub resources: Resources<true>,
pub non_send_resources: Resources<false>,
}
impl Storages {
pub fn prepare_component(&mut self, component: &ComponentInfo) {
match component.storage_type() {
StorageType::Table => {
}
StorageType::SparseSet => {
self.sparse_sets.get_or_insert(component);
}
}
}
}
struct AbortOnPanic;
impl Drop for AbortOnPanic {
fn drop(&mut self) {
panic!("Aborting due to allocator error");
}
}
trait VecExtensions<T> {
unsafe fn swap_remove_nonoverlapping_unchecked(&mut self, index: usize) -> T;
}
impl<T> VecExtensions<T> for Vec<T> {
#[inline]
unsafe fn swap_remove_nonoverlapping_unchecked(&mut self, index: usize) -> T {
let value = unsafe { self.as_mut_ptr().add(index).read() };
let len = self.len();
let base_ptr = self.as_mut_ptr();
unsafe { core::ptr::copy_nonoverlapping(base_ptr.add(len - 1), base_ptr.add(index), 1) };
unsafe { self.set_len(len - 1) };
value
}
}