use crate::imp_prelude::*;
use crate::{Layout, NdProducer};
use std::ops::{Deref, DerefMut};
#[repr(transparent)]
pub(crate) struct SendProducer<T> {
inner: T
}
impl<T> SendProducer<T> {
pub(crate) unsafe fn new(producer: T) -> Self { Self { inner: producer } }
}
unsafe impl<P> Send for SendProducer<P> { }
impl<P> Deref for SendProducer<P> {
type Target = P;
fn deref(&self) -> &P { &self.inner }
}
impl<P> DerefMut for SendProducer<P> {
fn deref_mut(&mut self) -> &mut P { &mut self.inner }
}
impl<P: NdProducer> NdProducer for SendProducer<P>
where P: NdProducer,
{
type Item = P::Item;
type Dim = P::Dim;
type Ptr = P::Ptr;
type Stride = P::Stride;
private_impl! {}
#[inline(always)]
fn raw_dim(&self) -> Self::Dim {
self.inner.raw_dim()
}
#[inline(always)]
fn equal_dim(&self, dim: &Self::Dim) -> bool {
self.inner.equal_dim(dim)
}
#[inline(always)]
fn as_ptr(&self) -> Self::Ptr {
self.inner.as_ptr()
}
#[inline(always)]
fn layout(&self) -> Layout {
self.inner.layout()
}
#[inline(always)]
unsafe fn as_ref(&self, ptr: Self::Ptr) -> Self::Item {
self.inner.as_ref(ptr)
}
#[inline(always)]
unsafe fn uget_ptr(&self, i: &Self::Dim) -> Self::Ptr {
self.inner.uget_ptr(i)
}
#[inline(always)]
fn stride_of(&self, axis: Axis) -> Self::Stride {
self.inner.stride_of(axis)
}
#[inline(always)]
fn contiguous_stride(&self) -> Self::Stride {
self.inner.contiguous_stride()
}
fn split_at(self, axis: Axis, index: usize) -> (Self, Self) {
let (a, b) = self.inner.split_at(axis, index);
(Self { inner: a }, Self { inner: b })
}
}