cubecl_tile/space/
axis.rs1use cubecl::zspace::SmallVec;
4use serde::{Deserialize, Serialize};
5
6use crate::Space;
7
8#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
10pub struct Axis(pub u8);
11
12#[derive(Clone, PartialEq, Eq, Hash, Debug)]
14pub(crate) struct AxisMap<T: Copy> {
15 entries: SmallVec<[(Axis, T); Space::MAX_RANK]>,
16}
17
18impl<T: Copy> AxisMap<T> {
19 pub(crate) fn new(entries: &[(Axis, T)]) -> Self {
21 AxisMap {
22 entries: SmallVec::from_slice(entries),
23 }
24 }
25
26 pub(crate) fn get(&self, axis: Axis) -> T {
27 self.entries
28 .iter()
29 .find(|(a, _)| *a == axis)
30 .expect("AxisMap::get: axis not present")
31 .1
32 }
33
34 pub(crate) fn axis_at(&self, i: usize) -> Axis {
35 self.entries[i].0
36 }
37
38 pub(crate) fn axes(&self) -> impl Iterator<Item = Axis> + '_ {
40 self.entries.iter().map(|&(a, _)| a)
41 }
42
43 pub(crate) fn position(&self, axis: Axis) -> usize {
44 self.entries
45 .iter()
46 .position(|(a, _)| *a == axis)
47 .expect("AxisMap::position: axis not present")
48 }
49
50 pub(crate) fn contains(&self, axis: Axis) -> bool {
51 self.entries.iter().any(|(a, _)| *a == axis)
52 }
53
54 pub(crate) fn len(&self) -> usize {
55 self.entries.len()
56 }
57}