11use serde:: { Deserialize , Serialize } ;
22use thiserror:: Error ;
33
4- use super :: Kind ;
5-
6- // #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Copy, Serialize, Deserialize)]
7- // pub struct Index(u32);
4+ use super :: { Kind , Kindable } ;
85
96#[ derive( Debug , PartialEq , Eq , PartialOrd , Ord , Clone , Hash , Copy , Serialize , Deserialize ) ]
10- pub enum Index {
7+ pub enum DBIndex {
118 Expr ( u32 ) ,
129 Nat ( u32 ) ,
1310 Data ( u32 ) ,
1411 Addr ( u32 ) ,
1512}
1613
17- impl Index {
14+ impl DBIndex {
1815 pub fn inc ( self ) -> Self {
19- self + Shift :: up ( )
16+ self + DBShift :: up ( )
2017 }
2118
2219 pub fn dec ( self ) -> Self {
23- self + Shift :: down ( )
20+ self + DBShift :: down ( )
2421 }
2522
2623 pub fn new ( value : u32 , kind : Kind ) -> Self {
2724 match kind {
28- Kind :: Expr => Index :: Expr ( value) ,
29- Kind :: Nat => Index :: Nat ( value) ,
30- Kind :: Data => Index :: Data ( value) ,
31- Kind :: Addr => Index :: Addr ( value) ,
25+ Kind :: Expr => DBIndex :: Expr ( value) ,
26+ Kind :: Nat => DBIndex :: Nat ( value) ,
27+ Kind :: Data => DBIndex :: Data ( value) ,
28+ Kind :: Addr => DBIndex :: Addr ( value) ,
3229 }
3330 }
3431
3532 pub fn zero ( kind : Kind ) -> Self {
3633 match kind {
37- Kind :: Expr => Index :: Expr ( 0 ) ,
38- Kind :: Nat => Index :: Nat ( 0 ) ,
39- Kind :: Data => Index :: Data ( 0 ) ,
40- Kind :: Addr => Index :: Addr ( 0 ) ,
41- }
42- }
43-
44- pub fn zero_like ( other : Self ) -> Self {
45- match other {
46- Index :: Expr ( _) => Index :: Expr ( 0 ) ,
47- Index :: Nat ( _) => Index :: Nat ( 0 ) ,
48- Index :: Data ( _) => Index :: Data ( 0 ) ,
49- Index :: Addr ( _) => Index :: Addr ( 0 ) ,
34+ Kind :: Expr => DBIndex :: Expr ( 0 ) ,
35+ Kind :: Nat => DBIndex :: Nat ( 0 ) ,
36+ Kind :: Data => DBIndex :: Data ( 0 ) ,
37+ Kind :: Addr => DBIndex :: Addr ( 0 ) ,
5038 }
5139 }
5240
5341 pub fn value ( self ) -> u32 {
5442 match self {
55- Index :: Expr ( i) | Index :: Nat ( i) | Index :: Data ( i) | Index :: Addr ( i) => i,
43+ DBIndex :: Expr ( i) | DBIndex :: Nat ( i) | DBIndex :: Data ( i) | DBIndex :: Addr ( i) => i,
5644 }
5745 }
5846
@@ -61,30 +49,30 @@ impl Index {
6149 }
6250}
6351
64- impl std:: ops:: Add < Shift > for Index {
52+ impl std:: ops:: Add < DBShift > for DBIndex {
6553 type Output = Self ;
6654
67- fn add ( self , rhs : Shift ) -> Self :: Output {
55+ fn add ( self , rhs : DBShift ) -> Self :: Output {
6856 match self {
69- Index :: Expr ( i) => Index :: Expr ( i. strict_add_signed ( rhs. 0 ) ) ,
70- Index :: Nat ( i) => Index :: Nat ( i. strict_add_signed ( rhs. 0 ) ) ,
71- Index :: Data ( i) => Index :: Data ( i. strict_add_signed ( rhs. 0 ) ) ,
72- Index :: Addr ( i) => Index :: Addr ( i. strict_add_signed ( rhs. 0 ) ) ,
57+ DBIndex :: Expr ( i) => DBIndex :: Expr ( i. strict_add_signed ( rhs. 0 ) ) ,
58+ DBIndex :: Nat ( i) => DBIndex :: Nat ( i. strict_add_signed ( rhs. 0 ) ) ,
59+ DBIndex :: Data ( i) => DBIndex :: Data ( i. strict_add_signed ( rhs. 0 ) ) ,
60+ DBIndex :: Addr ( i) => DBIndex :: Addr ( i. strict_add_signed ( rhs. 0 ) ) ,
7361 }
7462 }
7563}
7664
77- impl std:: str:: FromStr for Index {
65+ impl std:: str:: FromStr for DBIndex {
7866 type Err = IndexError ;
7967
8068 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
8169 if let Some ( stripped_s) = s. strip_prefix ( "%" ) {
8270 if let Some ( ( tag, i) ) = stripped_s. split_at_checked ( 1 ) {
8371 match tag {
84- "e" => Ok ( Index :: Expr ( i. parse ( ) ?) ) ,
85- "n" => Ok ( Index :: Nat ( i. parse ( ) ?) ) ,
86- "d" => Ok ( Index :: Data ( i. parse ( ) ?) ) ,
87- "a" => Ok ( Index :: Addr ( i. parse ( ) ?) ) ,
72+ "e" => Ok ( DBIndex :: Expr ( i. parse ( ) ?) ) ,
73+ "n" => Ok ( DBIndex :: Nat ( i. parse ( ) ?) ) ,
74+ "d" => Ok ( DBIndex :: Data ( i. parse ( ) ?) ) ,
75+ "a" => Ok ( DBIndex :: Addr ( i. parse ( ) ?) ) ,
8876 _ => Err ( IndexError :: ImproperTag ( stripped_s. to_owned ( ) ) ) ,
8977 }
9078 } else {
@@ -96,21 +84,32 @@ impl std::str::FromStr for Index {
9684 }
9785}
9886
99- impl std:: fmt:: Display for Index {
87+ impl std:: fmt:: Display for DBIndex {
10088 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
10189 match self {
102- Index :: Expr ( i) => write ! ( f, "%e{i}" ) ,
103- Index :: Nat ( i) => write ! ( f, "%n{i}" ) ,
104- Index :: Data ( i) => write ! ( f, "%d{i}" ) ,
105- Index :: Addr ( i) => write ! ( f, "%a{i}" ) ,
90+ DBIndex :: Expr ( i) => write ! ( f, "%e{i}" ) ,
91+ DBIndex :: Nat ( i) => write ! ( f, "%n{i}" ) ,
92+ DBIndex :: Data ( i) => write ! ( f, "%d{i}" ) ,
93+ DBIndex :: Addr ( i) => write ! ( f, "%a{i}" ) ,
94+ }
95+ }
96+ }
97+
98+ impl Kindable for DBIndex {
99+ fn kind ( & self ) -> Kind {
100+ match self {
101+ DBIndex :: Expr ( _) => Kind :: Expr ,
102+ DBIndex :: Nat ( _) => Kind :: Nat ,
103+ DBIndex :: Data ( _) => Kind :: Data ,
104+ DBIndex :: Addr ( _) => Kind :: Addr ,
106105 }
107106 }
108107}
109108
110109#[ derive( Debug , PartialEq , Eq , PartialOrd , Ord , Clone , Hash , Copy , Serialize , Deserialize ) ]
111- pub struct Shift ( i32 ) ;
110+ pub struct DBShift ( i32 ) ;
112111
113- impl Shift {
112+ impl DBShift {
114113 pub fn up ( ) -> Self {
115114 Self ( 1 )
116115 }
@@ -120,18 +119,18 @@ impl Shift {
120119 }
121120}
122121
123- impl TryFrom < i32 > for Shift {
122+ impl TryFrom < i32 > for DBShift {
124123 type Error = IndexError ;
125124
126125 fn try_from ( value : i32 ) -> Result < Self , Self :: Error > {
127126 if value == 0 {
128127 return Err ( IndexError :: ZeroShift ) ;
129128 }
130- Ok ( Shift ( value) )
129+ Ok ( DBShift ( value) )
131130 }
132131}
133132
134- impl std:: fmt:: Display for Shift {
133+ impl std:: fmt:: Display for DBShift {
135134 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
136135 write ! ( f, "{}" , self . 0 )
137136 }
0 commit comments