use cubecl::prelude::*;
use crate::*;
#[cube]
pub fn scale_tile<S: Numeric>(
level: &ComptimeOption<TileArg<'static, u32, Const<1>>>,
#[comptime] space: Partitioning,
) -> ComptimeOption<Tile<S>> {
#[comptime]
match level {
ComptimeOption::Some(level) => {
ComptimeOption::new_Some(level.tile_as::<S>(comptime!(space.clone())))
}
ComptimeOption::None => ComptimeOption::new_None(),
}
}
#[cube]
pub trait MaybeTile: CubeType {
type E: Numeric;
fn at(&self, region: &Region) -> ComptimeOption<Tile<Self::E>>;
fn staged(
&self,
#[comptime] level: Option<Level>,
#[comptime] storage: StageStorage,
) -> ComptimeOption<Tile<Self::E>>;
fn copy_from(&mut self, src: &ComptimeOption<Tile<Self::E>>);
}
#[cube]
impl<E: Numeric> MaybeTile for ComptimeOption<Tile<E>> {
type E = E;
fn at(&self, region: &Region) -> ComptimeOption<Tile<E>> {
#[comptime]
match self {
ComptimeOption::Some(level) => ComptimeOption::new_Some(level.at(region)),
ComptimeOption::None => ComptimeOption::new_None(),
}
}
fn staged(
&self,
#[comptime] level: Option<Level>,
#[comptime] storage: StageStorage,
) -> ComptimeOption<Tile<E>> {
match comptime!(level) {
None => self.clone(),
Some(level) =>
{
#[comptime]
match self {
ComptimeOption::Some(scales) => ComptimeOption::new_Some(
scales.stage(comptime!(level.clone()), comptime!(storage.clone())),
),
ComptimeOption::None => ComptimeOption::new_None(),
}
}
}
}
fn copy_from(&mut self, src: &ComptimeOption<Tile<E>>) {
#[comptime]
if let (ComptimeOption::Some(stage), ComptimeOption::Some(src)) = (self, src) {
stage.copy_from(src);
}
}
}