1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
2pub struct Span {
3 pub start: usize,
4 pub end: usize,
5}
6
7impl Span {
8 pub fn new(start: usize, end: usize) -> Self {
9 Self { start, end }
10 }
11
12 pub fn start_position(self, source: &str) -> SourcePosition {
13 SourcePosition::from_offset(source, self.start)
14 }
15
16 pub fn end_position(self, source: &str) -> SourcePosition {
17 SourcePosition::from_offset(source, self.end)
18 }
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub struct SourcePosition {
23 pub line: usize,
24 pub column: usize,
25}
26
27impl SourcePosition {
28 pub fn from_offset(source: &str, offset: usize) -> Self {
29 let clamped = offset.min(source.len());
30 let prefix = &source[..clamped];
31 let line = prefix.bytes().filter(|b| *b == b'\n').count() + 1;
32 let column = match prefix.rfind('\n') {
33 Some(index) => prefix[index + 1..].chars().count() + 1,
34 None => prefix.chars().count() + 1,
35 };
36 Self { line, column }
37 }
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq)]
41pub enum StateSpace {
42 Reg,
43 SReg,
44 Const,
45 Global,
46 Local,
47 Param,
48 Shared,
49 Tex,
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq)]
53pub enum ScalarType {
54 B8,
55 B16,
56 B32,
57 B64,
58 B128,
59 S8,
60 S16,
61 S32,
62 S64,
63 U8,
64 U16,
65 U32,
66 U64,
67 F16,
68 F16x2,
69 F32,
70 F64,
71 Bf16,
72 Tf32,
73 Pred,
74 TexRef,
75 SamplerRef,
76 SurfRef,
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq)]
80pub enum FloatRoundingMode {
81 Rn,
82 Rna,
83 Rz,
84 Rm,
85 Rp,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89pub enum IntRoundingMode {
90 Rni,
91 Rzi,
92 Rmi,
93 Rpi,
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq)]
97pub enum CompareOp {
98 Eq,
99 Ne,
100 Lt,
101 Le,
102 Gt,
103 Ge,
104 Lo,
105 Ls,
106 Hi,
107 Hs,
108 Equ,
109 Neu,
110 Ltu,
111 Leu,
112 Gtu,
113 Geu,
114 Num,
115 Nan,
116}
117
118#[derive(Debug, Clone, Copy, PartialEq, Eq)]
119pub enum MulMode {
120 Hi,
121 Lo,
122 Wide,
123}
124
125#[derive(Debug, Clone, Copy, PartialEq, Eq)]
126pub enum LinkingDirective {
127 Extern,
128 Visible,
129 Weak,
130 Common,
131}
132
133#[derive(Debug, Clone, Copy, PartialEq, Eq)]
134pub enum VectorSize {
135 V2,
136 V4,
137}