blaze-rs 1.0.3

A Rustified OpenCL Experience
Documentation
use std::{marker::PhantomData};
use crate::{prelude::*, image::{channel::RawPixel, RawImage}, event::WaitList, memobj::{Slice2D}, buffer::rect::Rect2D};

#[repr(transparent)]
pub struct WriteImage2D<'src, 'dst, P: RawPixel> {
    event: RawEvent,
    src: PhantomData<&'src P>,
    dst: PhantomData<&'dst mut P>
}

impl<'src, 'dst, P: RawPixel + Unpin> WriteImage2D<'src, 'dst, P> {
    #[inline]
    pub unsafe fn new (src: &'src Rect2D<P>, dst: &'dst mut RawImage, queue: &CommandQueue, offset: [usize; 2], row_pitch: Option<usize>, slice_pitch: Option<usize>, wait: impl Into<WaitList>) -> Result<Self> {
        if let Some(slice) = Slice2D::try_new(offset[0], offset[1], src.width() as usize, src.height() as usize) {
            let [origin, region] = slice.raw_parts();
            let event = dst.write_from_ptr(origin, region, row_pitch, slice_pitch, src.as_ptr().cast(), queue, wait)?;

            return Ok(Self {
                event,
                src: PhantomData,
                dst: PhantomData
            })
        }

        todo!()
    }
}

impl<'src, 'dst, P: RawPixel + Unpin> Event for WriteImage2D<'src, 'dst, P> {
    type Output = ();

    #[inline(always)]
    fn as_raw (&self) -> &RawEvent {
        &self.event
    }

    #[inline(always)]
    fn consume (self, err: Option<Error>) -> Result<Self::Output> {
        if let Some(err) = err { return Err(err) }
        Ok(())
    }
}