use crate::bitset::*;
use crate::*;
use std::cell::{Ref, RefMut, UnsafeCell};
use std::ops::{Deref, DerefMut};
pub trait StorageSpec<'a> {
type Component: 'a;
type Storage: ComponentStorage<'a, Component = Self::Component>;
}
pub struct ReadComponent<'a, T: StorageSpec<'a>> {
pub(crate) storage: Ref<'a, T::Storage>,
}
pub struct WriteComponent<'a, T: 'a + StorageSpec<'a>> {
pub(crate) storage: RefMut<'a, T::Storage>,
}
pub struct ReadResource<'a, T> {
pub(crate) resource: Ref<'a, T>,
}
pub struct WriteResource<'a, T> {
pub(crate) resource: RefMut<'a, T>,
}
impl<'a, T> Clone for ReadComponent<'a, T>
where
T: 'a + StorageSpec<'a>,
{
#[inline]
fn clone(&self) -> Self {
ReadComponent {
storage: Ref::clone(&self.storage),
}
}
}
impl<'a, T> ReadComponent<'a, T>
where
T: 'a + StorageSpec<'a>,
T::Storage: ComponentStorage<'a>,
{
#[inline]
pub fn get(v: &Self) -> &T::Storage {
Deref::deref(&v.storage)
}
}
impl<'a, T> Deref for ReadComponent<'a, T>
where
T: 'a + StorageSpec<'a>,
T::Storage: ComponentStorage<'a>,
{
type Target = T::Storage;
#[inline]
fn deref(&self) -> &T::Storage {
Deref::deref(&self.storage)
}
}
impl<'a, T> WriteComponent<'a, T>
where
T: StorageSpec<'a>,
T::Storage: ComponentStorage<'a>,
{
#[inline]
pub fn get_mut(v: &mut Self) -> &mut T::Storage {
DerefMut::deref_mut(&mut v.storage)
}
}
impl<'a, T> Deref for WriteComponent<'a, T>
where
T: StorageSpec<'a>,
T::Storage: ComponentStorage<'a>,
{
type Target = T::Storage;
#[inline]
fn deref(&self) -> &T::Storage {
Deref::deref(&self.storage)
}
}
impl<'a, T> DerefMut for WriteComponent<'a, T>
where
T: StorageSpec<'a>,
T::Storage: ComponentStorage<'a>,
{
#[inline]
fn deref_mut(&mut self) -> &mut T::Storage {
DerefMut::deref_mut(&mut self.storage)
}
}
impl<'a, T> ReadResource<'a, T> {
#[inline]
pub fn get(v: &Self) -> &T {
Deref::deref(&v.resource)
}
}
impl<'a, T> Deref for ReadResource<'a, T> {
type Target = T;
#[inline]
fn deref(&self) -> &T {
Deref::deref(&self.resource)
}
}
impl<'a, T> Clone for ReadResource<'a, T> {
#[inline]
fn clone(&self) -> Self {
ReadResource {
resource: Ref::clone(&self.resource),
}
}
}
impl<'a, T> WriteResource<'a, T> {
#[inline]
pub fn get_mut(v: &mut Self) -> &mut T {
DerefMut::deref_mut(&mut v.resource)
}
}
impl<'a, T> Deref for WriteResource<'a, T> {
type Target = T;
#[inline]
fn deref(&self) -> &T {
Deref::deref(&self.resource)
}
}
impl<'a, T> DerefMut for WriteResource<'a, T> {
#[inline]
fn deref_mut(&mut self) -> &mut T {
DerefMut::deref_mut(&mut self.resource)
}
}
pub trait ComponentStorage<'a> {
type Component: 'a;
type Iter: Iterator<Item = Option<&'a Self::Component>>;
fn get<'b>(&'b self, entity: Entity) -> Option<&'b Self::Component>;
fn get_raw(&self, entity: Entity) -> *const Self::Component;
fn set(&mut self, entity: Entity, item: Option<Self::Component>);
fn reserve(&mut self, _n: usize) {}
fn size(&self) -> usize;
fn iter(&'a self) -> Self::Iter;
}
pub trait MutableComponentStorage<'a>: ComponentStorage<'a> {
fn get_mut<'b>(&'b mut self, entity: Entity) -> Option<&'b mut Self::Component>;
fn get_raw_mut(&mut self, entity: Entity) -> *mut Self::Component;
type IterMut: Iterator<Item = Option<&'a mut <Self as ComponentStorage<'a>>::Component>>;
fn iter_mut(&'a mut self) -> Self::IterMut;
}
#[derive(Debug, Default)]
pub struct BasicVecStorage<T>(Vec<Option<UnsafeCell<T>>>);
impl<'a, T> ComponentStorage<'a> for BasicVecStorage<T>
where
T: 'a,
{
type Component = T;
type Iter = std::iter::Map<
std::slice::Iter<'a, Option<UnsafeCell<T>>>,
fn(&'a Option<UnsafeCell<T>>) -> Option<&'a T>,
>;
#[inline]
fn get<'b>(&'b self, entity: Entity) -> Option<&'b T> {
if entity.id < self.0.len() {
self.0[entity.id].as_ref().map(|v| unsafe { &*v.get() })
} else {
None
}
}
#[inline]
fn get_raw(&self, entity: Entity) -> *const T {
self.0[entity.id]
.as_ref()
.map_or(std::ptr::null(), |v| v.get())
}
#[inline]
fn set(&mut self, entity: Entity, item: Option<T>) {
if entity.id >= self.0.len() {
let n = entity.id - self.0.len() + 1;
self.0.reserve(n);
for _ in 0..n {
self.0.push(None);
}
}
self.0[entity.id] = item.map(|x| UnsafeCell::new(x));
}
#[inline]
fn reserve(&mut self, n: usize) {
self.0.reserve(n);
}
#[inline]
fn size(&self) -> usize {
self.0.len()
}
#[inline]
fn iter(&'a self) -> Self::Iter {
self.0
.iter()
.map(|v| v.as_ref().map(|u| unsafe { &*(u.get()) }))
}
}
impl<'a, T: 'a> MutableComponentStorage<'a> for BasicVecStorage<T> {
type IterMut = std::iter::Map<
std::slice::IterMut<'a, Option<UnsafeCell<T>>>,
fn(&mut Option<UnsafeCell<T>>) -> Option<&'a mut T>,
>;
#[inline]
fn iter_mut(&'a mut self) -> Self::IterMut {
self.0
.iter_mut()
.map(|v| v.as_ref().map(|u| unsafe { &mut *(u.get()) }))
}
#[inline]
fn get_mut<'b>(&'b mut self, entity: Entity) -> Option<&'b mut T> {
if entity.id < self.0.len() {
self.0[entity.id].as_ref().map(|v| unsafe { &mut *v.get() })
} else {
None
}
}
#[inline]
fn get_raw_mut(&mut self, entity: Entity) -> *mut T {
if entity.id < self.0.len() {
self.0[entity.id]
.as_ref()
.map_or(std::ptr::null_mut(), |v| unsafe { &mut *v.get() })
} else {
std::ptr::null_mut()
}
}
}
#[derive(Default)]
pub struct VoidStorage<T: Default> {
storage: Vec<u32>,
instance: T,
}
impl<'a, T: 'a + Default> ComponentStorage<'a> for VoidStorage<T> {
type Component = T;
type Iter = VoidStorageIter<'a, T>;
#[inline]
fn get(&self, entity: Entity) -> Option<&T> {
if entity.id / 32 < self.storage.len()
&& self.storage[entity.id / 32].get_bit(entity.id % 32)
{
Some(&self.instance)
} else {
None
}
}
#[inline]
fn get_raw(&self, entity: Entity) -> *const T {
if entity.id / 32 < self.storage.len()
&& self.storage[entity.id / 32].get_bit(entity.id % 32)
{
&self.instance as *const T
} else {
std::ptr::null()
}
}
#[inline]
fn set(&mut self, entity: Entity, item: Option<T>) {
if entity.id / 32 >= self.storage.len() {
let n = self.storage.len() - entity.id / 32 + 1;
for _ in 0..n {
self.storage.push(0);
}
}
match item {
Some(_) => {
self.storage[entity.id / 32].set_bit(entity.id % 32);
}
None => {
self.storage[entity.id / 32].clear_bit(entity.id % 32);
}
}
}
#[inline]
fn reserve(&mut self, n: usize) {
self.storage.reserve((n + 1) / 32);
}
#[inline]
fn size(&self) -> usize {
self.storage.len() * 32
}
#[inline]
fn iter(&'a self) -> Self::Iter {
VoidStorageIter::new(self.storage.iter(), &self.instance)
}
}
pub struct VoidStorageIter<'a, T> {
iter: std::slice::Iter<'a, u32>,
cur_bits: u32,
cur: usize,
instance: &'a T,
}
impl<'a, T> VoidStorageIter<'a, T> {
#[inline]
fn new(mut iter: std::slice::Iter<'a, u32>, instance: &'a T) -> Self {
match iter.next() {
Some(v) => VoidStorageIter {
iter: iter,
cur_bits: *v,
cur: 0,
instance: instance,
},
None => VoidStorageIter {
iter: iter,
cur_bits: 0,
cur: 31,
instance: instance,
},
}
}
}
impl<'a, T> Iterator for VoidStorageIter<'a, T> {
type Item = Option<&'a T>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.cur == 31 {
match self.iter.next() {
Some(v) => {
self.cur_bits = *v;
self.cur = 1;
if self.cur_bits.get_bit(0) {
Some(Some(self.instance))
} else {
Some(None)
}
}
None => None,
}
} else {
self.cur += 1;
if self.cur_bits.get_bit(self.cur - 1) {
Some(Some(self.instance))
} else {
Some(None)
}
}
}
}