use std::marker::PhantomData;
use furiosa_mapping::*;
use crate::context::*;
use crate::runtime::{Backend, CurrentBackend};
use crate::scalar::*;
use crate::tensor::Tensor;
pub trait Position: std::fmt::Debug + 'static {}
#[derive(Debug)]
pub struct PositionBegin;
impl Position for PositionBegin {}
#[derive(Debug)]
pub struct TuTensor<
'l,
const T: Tu,
P: Position,
D: Scalar,
Chip: M,
Cluster: M,
Slice: M,
Time: M,
Packet: M,
B: Backend = CurrentBackend,
> {
pub(crate) ctx: &'l mut TuContext<{ T }>,
pub(crate) inner: Tensor<D, Pair<Chip, Pair<Cluster, Pair<Slice, Pair<Time, Packet>>>>, B>,
_position: PhantomData<P>,
}
impl<'l, const T: Tu, P: Position, D: Scalar, Chip: M, Cluster: M, Slice: M, Time: M, Packet: M, B: Backend>
TuTensor<'l, T, P, D, Chip, Cluster, Slice, Time, Packet, B>
{
pub type Mapping = m![{ Chip }, { Cluster }, { Slice }, { Time }, { Packet }];
pub fn new(ctx: &'l mut TuContext<{ T }>, inner: Tensor<D, Self::Mapping, B>) -> Self {
Self {
ctx,
inner,
_position: PhantomData,
}
}
}
pub type BeginTensor<'l, const T: Tu, D, Chip, Cluster, Slice, Time, Packet, B = CurrentBackend> =
TuTensor<'l, { T }, PositionBegin, D, Chip, Cluster, Slice, Time, Packet, B>;