use core::{
ffi::c_void,
ops::{Deref, DerefMut},
ptr::null_mut,
};
use crate::{shape::Shape, Buffer, CloneBuf, CommonPtrs, Device, PtrType};
pub struct Num<T> {
pub num: T,
}
impl<T> PtrType for Num<T> {
#[inline]
fn size(&self) -> usize {
0
}
#[inline]
fn flag(&self) -> crate::flag::AllocFlag {
crate::flag::AllocFlag::Num
}
}
impl<T> CommonPtrs<T> for Num<T> {
#[inline]
fn ptrs(&self) -> (*const T, *mut c_void, u64) {
(&self.num as *const T, null_mut(), 0)
}
#[inline]
fn ptrs_mut(&mut self) -> (*mut T, *mut c_void, u64) {
(&mut self.num as *mut T, null_mut(), 0)
}
}
impl Device for () {
type Ptr<U, S: Shape> = Num<U>;
type Cache = ();
fn new() -> crate::Result<Self> {
Ok(())
}
}
impl<'a, T: Clone> CloneBuf<'a, T> for () {
#[inline]
fn clone_buf(&self, buf: &Buffer<'a, T, Self>) -> Buffer<'a, T, Self> {
Buffer {
ptr: Num {
num: buf.ptr.num.clone(),
},
device: buf.device,
#[cfg(not(feature = "no-std"))]
ident: buf.ident,
}
}
}
impl<T: crate::number::Number> From<T> for Buffer<'_, T, ()> {
#[inline]
fn from(ptr: T) -> Self {
Buffer {
ptr: Num { num: ptr },
device: None,
#[cfg(not(feature = "no-std"))]
ident: None,
}
}
}
impl<'a, T> Buffer<'a, T, ()> {
#[inline]
pub fn copy(&self) -> Self
where
T: Copy,
{
Buffer {
ptr: Num { num: self.ptr.num },
device: self.device,
#[cfg(not(feature = "no-std"))]
ident: self.ident,
}
}
#[inline]
pub fn item(&self) -> T
where
T: Copy,
{
self.ptr.num
}
}
impl<'a, T> Deref for Buffer<'a, T, ()> {
type Target = T;
#[inline]
fn deref(&self) -> &Self::Target {
&self.ptr.num
}
}
impl<'a, T> DerefMut for Buffer<'a, T, ()> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.ptr.num
}
}
#[cfg(test)]
mod tests {
use crate::Buffer;
#[test]
fn test_deref() {
let a = Buffer::from(5);
let b = Buffer::from(7);
let c = *a + *b;
assert_eq!(c, 12);
}
#[test]
fn test_deref_mut() {
let mut a = Buffer::from(5);
*a += 10;
assert_eq!(*a, 15);
}
}