@@ -93,12 +93,15 @@ impl Kindable for DBIndex {
9393}
9494
9595#[ derive( Debug , PartialEq , Eq , PartialOrd , Ord , Clone , Hash , Copy , Serialize , Deserialize ) ]
96- pub struct DBShift {
97- expr : i32 ,
98- nat : i32 ,
99- data : i32 ,
100- addr : i32 ,
101- nat2nat : i32 ,
96+ pub enum DBShift {
97+ /// expr, nat, data, addr, nat2nat
98+ Expr ( ( i32 , i32 , i32 , i32 , i32 ) ) ,
99+ /// nat, nat2nat
100+ Nat ( ( i32 , i32 ) ) ,
101+ /// nat, data, nat2nat
102+ Data ( ( i32 , i32 , i32 ) ) ,
103+ /// addr
104+ Addr ( i32 ) ,
102105}
103106
104107impl DBShift {
@@ -110,85 +113,95 @@ impl DBShift {
110113 Self :: new_with ( kind, -1 )
111114 }
112115
113- pub fn get ( & self , kind : Kind ) -> i32 {
116+ fn get ( & self , kind : Kind ) -> i32 {
114117 match kind {
115- Kind :: Expr => self . expr ,
116- Kind :: Nat => self . nat ,
117- Kind :: Data => self . data ,
118- Kind :: Addr => self . addr ,
119- Kind :: Nat2Nat => self . nat2nat ,
118+ Kind :: Expr => self . expr_shift ( ) ,
119+ Kind :: Nat => self . nat_shift ( ) ,
120+ Kind :: Data => self . data_shift ( ) ,
121+ Kind :: Addr => self . addr_shift ( ) ,
122+ Kind :: Nat2Nat => self . nat2nat_shift ( ) ,
123+ }
124+ }
125+
126+ pub fn expr_shift ( & self ) -> i32 {
127+ match self {
128+ DBShift :: Expr ( ( expr_shift, _, _, _, _) ) => * expr_shift,
129+ DBShift :: Nat ( _) | DBShift :: Data ( _) | DBShift :: Addr ( _) => 0 ,
130+ }
131+ }
132+
133+ pub fn nat_shift ( & self ) -> i32 {
134+ match self {
135+ DBShift :: Expr ( ( _, nat_shift, _, _, _) )
136+ | DBShift :: Nat ( ( nat_shift, _) )
137+ | DBShift :: Data ( ( nat_shift, _, _) ) => * nat_shift,
138+ DBShift :: Addr ( _) => 0 ,
139+ }
140+ }
141+
142+ pub fn data_shift ( & self ) -> i32 {
143+ match self {
144+ DBShift :: Expr ( ( _, _, data_shift, _, _) ) | DBShift :: Data ( ( _, data_shift, _) ) => {
145+ * data_shift
146+ }
147+ DBShift :: Nat ( _) | DBShift :: Addr ( _) => 0 ,
148+ }
149+ }
150+
151+ pub fn addr_shift ( & self ) -> i32 {
152+ match self {
153+ DBShift :: Expr ( ( _, _, _, addr_shift, _) ) | DBShift :: Addr ( addr_shift) => * addr_shift,
154+ DBShift :: Nat ( _) | DBShift :: Data ( _) => 0 ,
155+ }
156+ }
157+
158+ pub fn nat2nat_shift ( & self ) -> i32 {
159+ match self {
160+ DBShift :: Expr ( ( _, _, _, _, nat2nat_shift) )
161+ | DBShift :: Nat ( ( _, nat2nat_shift) )
162+ | DBShift :: Data ( ( _, _, nat2nat_shift) ) => * nat2nat_shift,
163+ DBShift :: Addr ( _) => 0 ,
120164 }
121165 }
122166
123- fn new_with ( kind : Kind , value : i32 ) -> Self {
167+ fn new_with ( kind : Kind , arg : i32 ) -> DBShift {
124168 match kind {
125- Kind :: Expr => Self {
126- expr : value,
127- nat : 0 ,
128- data : 0 ,
129- addr : 0 ,
130- nat2nat : 0 ,
131- } ,
132- Kind :: Nat => Self {
133- expr : 0 ,
134- nat : value,
135- data : 0 ,
136- addr : 0 ,
137- nat2nat : 0 ,
138- } ,
139- Kind :: Data => Self {
140- expr : 0 ,
141- nat : 0 ,
142- data : value,
143- addr : 0 ,
144- nat2nat : 0 ,
145- } ,
146- Kind :: Addr => Self {
147- expr : 0 ,
148- nat : 0 ,
149- data : 0 ,
150- addr : value,
151- nat2nat : 0 ,
152- } ,
153- Kind :: Nat2Nat => Self {
154- expr : 0 ,
155- nat : 0 ,
156- data : 0 ,
157- addr : 0 ,
158- nat2nat : value,
159- } ,
169+ Kind :: Expr => DBShift :: Expr ( ( arg, 0 , 0 , 0 , 0 ) ) ,
170+ Kind :: Nat => DBShift :: Nat ( ( arg, 0 ) ) ,
171+ Kind :: Data => DBShift :: Data ( ( arg, 0 , 0 ) ) ,
172+ Kind :: Addr => DBShift :: Addr ( arg) ,
173+ Kind :: Nat2Nat => panic ! ( "No Nat2Nat shift is possible" ) ,
160174 }
161175 }
162176}
163177
164- impl TryFrom < ( i32 , i32 , i32 , i32 , i32 ) > for DBShift {
165- type Error = IndexError ;
178+ impl From < ( i32 , i32 , i32 , i32 , i32 ) > for DBShift {
179+ fn from ( value : ( i32 , i32 , i32 , i32 , i32 ) ) -> Self {
180+ Self :: Expr ( value)
181+ }
182+ }
166183
167- fn try_from ( value : ( i32 , i32 , i32 , i32 , i32 ) ) -> Result < Self , Self :: Error > {
168- if value. 0 == 0 && value. 1 == 0 && value. 2 == 0 && value. 3 == 0 && value. 4 == 0 {
169- return Err ( IndexError :: ZeroShift ) ;
170- }
171- Ok ( Self {
172- expr : value. 0 ,
173- nat : value. 1 ,
174- data : value. 2 ,
175- addr : value. 3 ,
176- nat2nat : value. 4 ,
177- } )
184+ impl From < ( i32 , i32 , i32 ) > for DBShift {
185+ fn from ( value : ( i32 , i32 , i32 ) ) -> Self {
186+ Self :: Data ( value)
178187 }
179188}
180189
181- impl std:: fmt:: Display for DBShift {
182- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
183- write ! (
184- f,
185- "({}, {}, {}, {}, {})" ,
186- self . expr, self . nat, self . data, self . addr, self . nat2nat
187- )
190+ impl From < ( i32 , i32 ) > for DBShift {
191+ fn from ( value : ( i32 , i32 ) ) -> Self {
192+ Self :: Nat ( value)
188193 }
189194}
190195
191- #[ derive( Debug , PartialEq , Eq , PartialOrd , Ord , Clone , Hash , Copy , Serialize , Deserialize ) ]
196+ impl From < i32 > for DBShift {
197+ fn from ( value : i32 ) -> Self {
198+ Self :: Addr ( value)
199+ }
200+ }
201+
202+ #[ derive(
203+ Debug , PartialEq , Eq , PartialOrd , Ord , Clone , Hash , Copy , Default , Serialize , Deserialize ,
204+ ) ]
192205pub struct DBCutoff {
193206 expr : u32 ,
194207 nat : u32 ,
@@ -217,13 +230,7 @@ impl DBCutoff {
217230 // }
218231
219232 pub fn zero ( ) -> Self {
220- Self {
221- expr : 0 ,
222- nat : 0 ,
223- data : 0 ,
224- addr : 0 ,
225- nat2nat : 0 ,
226- }
233+ DBCutoff :: default ( )
227234 }
228235}
229236
@@ -232,11 +239,11 @@ impl std::ops::Add<DBShift> for DBCutoff {
232239
233240 fn add ( self , rhs : DBShift ) -> Self :: Output {
234241 Self {
235- expr : self . expr . strict_add_signed ( rhs. expr ) ,
236- nat : self . expr . strict_add_signed ( rhs. nat ) ,
237- data : self . expr . strict_add_signed ( rhs. data ) ,
238- addr : self . expr . strict_add_signed ( rhs. addr ) ,
239- nat2nat : self . expr . strict_add_signed ( rhs. nat2nat ) ,
242+ expr : self . expr . strict_add_signed ( rhs. expr_shift ( ) ) ,
243+ nat : self . nat . strict_add_signed ( rhs. nat_shift ( ) ) ,
244+ data : self . data . strict_add_signed ( rhs. data_shift ( ) ) ,
245+ addr : self . expr . strict_add_signed ( rhs. addr_shift ( ) ) ,
246+ nat2nat : self . expr . strict_add_signed ( rhs. nat2nat_shift ( ) ) ,
240247 }
241248 }
242249}
@@ -253,6 +260,36 @@ impl From<(u32, u32, u32, u32, u32)> for DBCutoff {
253260 }
254261}
255262
263+ impl From < ( u32 , u32 ) > for DBCutoff {
264+ fn from ( value : ( u32 , u32 ) ) -> Self {
265+ Self {
266+ nat : value. 0 ,
267+ nat2nat : value. 1 ,
268+ ..Default :: default ( )
269+ }
270+ }
271+ }
272+
273+ impl From < ( u32 , u32 , u32 ) > for DBCutoff {
274+ fn from ( value : ( u32 , u32 , u32 ) ) -> Self {
275+ Self {
276+ nat : value. 0 ,
277+ data : value. 1 ,
278+ nat2nat : value. 2 ,
279+ ..Default :: default ( )
280+ }
281+ }
282+ }
283+
284+ impl From < u32 > for DBCutoff {
285+ fn from ( value : u32 ) -> Self {
286+ Self {
287+ addr : value,
288+ ..Default :: default ( )
289+ }
290+ }
291+ }
292+
256293impl std:: fmt:: Display for DBCutoff {
257294 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
258295 write ! (
@@ -271,8 +308,6 @@ pub enum IndexError {
271308 ImproperTag ( String ) ,
272309 #[ error( "Missing Tag {0}" ) ]
273310 MissingTag ( String ) ,
274- #[ error( "Invalide zero shift" ) ]
275- ZeroShift ,
276311 #[ error( "Invalide Index: {0}" ) ]
277312 InvalidIndex ( #[ from] std:: num:: ParseIntError ) ,
278313}
0 commit comments