mod cpu;
mod io;
use std::{borrow::Cow, fmt::Debug, rc::Rc, sync::Arc};
pub use cpu::*;
pub use io::*;
use crate::{
mem::{CopyError, DeviceMemory},
Allocator,
};
pub unsafe trait Backend:
Sized + Allocator + DeviceMemory + Clone + Debug + Send + Sync + 'static
{
fn copy_from<B, T>(&self, data: T) -> Result<T::Output, CopyError>
where
B: Backend,
T: HasBackend + CopyIntoBackend<Self, B>,
{
data.copy_into_backend(self)
}
}
pub trait GlobalBackend: Backend + 'static {
fn global() -> &'static Self;
}
pub trait HasBackend {
type Backend: Backend;
fn backend(&self) -> &Self::Backend;
}
impl<T> HasBackend for &T
where
T: HasBackend,
{
type Backend = T::Backend;
fn backend(&self) -> &Self::Backend {
(**self).backend()
}
}
impl<T> HasBackend for &mut T
where
T: HasBackend,
{
type Backend = T::Backend;
fn backend(&self) -> &Self::Backend {
(**self).backend()
}
}
impl<'a, T> HasBackend for Cow<'a, T>
where
T: HasBackend + Clone,
{
type Backend = T::Backend;
fn backend(&self) -> &Self::Backend {
self.as_ref().backend()
}
}
impl<T> HasBackend for Box<T>
where
T: HasBackend,
{
type Backend = T::Backend;
fn backend(&self) -> &Self::Backend {
self.as_ref().backend()
}
}
impl<T> HasBackend for Arc<T>
where
T: HasBackend,
{
type Backend = T::Backend;
fn backend(&self) -> &Self::Backend {
self.as_ref().backend()
}
}
impl<T> HasBackend for Rc<T>
where
T: HasBackend,
{
type Backend = T::Backend;
fn backend(&self) -> &Self::Backend {
self.as_ref().backend()
}
}