use crate::Result;
use bytemuck::Pod;
use sycl_rs_sys::{kernel_bundle::ffi, types};
pub struct SourceKernelBundle(pub(crate) cxx::UniquePtr<types::ffi::SourceKernelBundle>);
impl From<cxx::UniquePtr<types::ffi::SourceKernelBundle>> for SourceKernelBundle {
fn from(value: cxx::UniquePtr<types::ffi::SourceKernelBundle>) -> Self {
Self(value)
}
}
impl SourceKernelBundle {
pub fn build(&mut self) -> Result<ExecutableKernelBundle> {
ffi::build(&mut self.0).map(Into::into)
}
}
pub struct ExecutableKernelBundle(pub(crate) cxx::UniquePtr<types::ffi::ExecutableKernelBundle>);
impl From<cxx::UniquePtr<types::ffi::ExecutableKernelBundle>> for ExecutableKernelBundle {
fn from(value: cxx::UniquePtr<types::ffi::ExecutableKernelBundle>) -> Self {
Self(value)
}
}
impl ExecutableKernelBundle {
pub fn get_kernel(&mut self, name: &str) -> Result<Kernel> {
ffi::get_kernel(&mut self.0, name).map(Into::into)
}
}
pub struct Kernel(pub(crate) cxx::UniquePtr<types::ffi::Kernel>);
impl From<cxx::UniquePtr<types::ffi::Kernel>> for Kernel {
fn from(value: cxx::UniquePtr<types::ffi::Kernel>) -> Self {
Self(value)
}
}
pub unsafe trait KernelArgument {
unsafe fn as_raw_arg(&self) -> &[u8];
}
unsafe impl<T: Pod> KernelArgument for T {
unsafe fn as_raw_arg(&self) -> &[u8] {
bytemuck::bytes_of(self)
}
}
pub unsafe trait KernelArgumentList<const ARGC: usize> {
unsafe fn as_raw_arg_list(&self) -> [&[u8]; ARGC];
}
unsafe impl KernelArgumentList<0> for () {
unsafe fn as_raw_arg_list(&self) -> [&[u8]; 0] {
[]
}
}
unsafe impl<T: KernelArgument> KernelArgumentList<1> for T {
unsafe fn as_raw_arg_list(&self) -> [&[u8]; 1] {
[unsafe { self.as_raw_arg() }]
}
}
pub use sycl_rs_derive::KernelArgumentList;
use sycl_rs_derive::impl_arg_list_for_tuples;
impl_arg_list_for_tuples! {16}