@@ -237,6 +237,98 @@ impl ScalarInt {
237
237
pub fn try_to_machine_usize < ' tcx > ( & self , tcx : TyCtxt < ' tcx > ) -> Result < u64 , Size > {
238
238
Ok ( self . to_bits ( tcx. data_layout . pointer_size ) ? as u64 )
239
239
}
240
+
241
+ /// Tries to convert the `ScalarInt` to an unsigned integer of the given size.
242
+ /// Fails if the size of the `ScalarInt` is unequal to `size` and returns the
243
+ /// `ScalarInt`s size in that case.
244
+ #[ inline]
245
+ pub fn try_to_uint ( self , size : Size ) -> Result < u128 , Size > {
246
+ self . to_bits ( size)
247
+ }
248
+
249
+ // Tries to convert the `ScalarInt` to `u8`. Fails if the `size` of the `ScalarInt`
250
+ // in not equal to `Size { raw: 1 }` and returns the `size` value of the `ScalarInt` in
251
+ // that case.
252
+ #[ inline]
253
+ pub fn try_to_u8 ( self ) -> Result < u8 , Size > {
254
+ self . to_bits ( Size :: from_bits ( 8 ) ) . map ( |v| u8:: try_from ( v) . unwrap ( ) )
255
+ }
256
+
257
+ /// Tries to convert the `ScalarInt` to `u16`. Fails if the size of the `ScalarInt`
258
+ /// in not equal to `Size { raw: 2 }` and returns the `size` value of the `ScalarInt` in
259
+ /// that case.
260
+ #[ inline]
261
+ pub fn try_to_u16 ( self ) -> Result < u16 , Size > {
262
+ self . to_bits ( Size :: from_bits ( 16 ) ) . map ( |v| u16:: try_from ( v) . unwrap ( ) )
263
+ }
264
+
265
+ /// Tries to convert the `ScalarInt` to `u32`. Fails if the `size` of the `ScalarInt`
266
+ /// in not equal to `Size { raw: 4 }` and returns the `size` value of the `ScalarInt` in
267
+ /// that case.
268
+ #[ inline]
269
+ pub fn try_to_u32 ( self ) -> Result < u32 , Size > {
270
+ self . to_bits ( Size :: from_bits ( 32 ) ) . map ( |v| u32:: try_from ( v) . unwrap ( ) )
271
+ }
272
+
273
+ /// Tries to convert the `ScalarInt` to `u64`. Fails if the `size` of the `ScalarInt`
274
+ /// in not equal to `Size { raw: 8 }` and returns the `size` value of the `ScalarInt` in
275
+ /// that case.
276
+ #[ inline]
277
+ pub fn try_to_u64 ( self ) -> Result < u64 , Size > {
278
+ self . to_bits ( Size :: from_bits ( 64 ) ) . map ( |v| u64:: try_from ( v) . unwrap ( ) )
279
+ }
280
+
281
+ /// Tries to convert the `ScalarInt` to `u128`. Fails if the `size` of the `ScalarInt`
282
+ /// in not equal to `Size { raw: 16 }` and returns the `size` value of the `ScalarInt` in
283
+ /// that case.
284
+ #[ inline]
285
+ pub fn try_to_u128 ( self ) -> Result < u128 , Size > {
286
+ self . to_bits ( Size :: from_bits ( 128 ) )
287
+ }
288
+
289
+ /// Tries to convert the `ScalarInt` to a signed integer of the given size.
290
+ /// Fails if the size of the `ScalarInt` is unequal to `size` and returns the
291
+ /// `ScalarInt`s size in that case.
292
+ #[ inline]
293
+ pub fn try_to_int ( self , size : Size ) -> Result < i128 , Size > {
294
+ let b = self . to_bits ( size) ?;
295
+ Ok ( size. sign_extend ( b) as i128 )
296
+ }
297
+
298
+ /// Tries to convert the `ScalarInt` to i8.
299
+ /// Fails if the size of the `ScalarInt` is unequal to `Size { raw: 1 }`
300
+ /// and returns the `ScalarInt`s size in that case.
301
+ pub fn try_to_i8 ( self ) -> Result < i8 , Size > {
302
+ self . try_to_int ( Size :: from_bits ( 8 ) ) . map ( |v| i8:: try_from ( v) . unwrap ( ) )
303
+ }
304
+
305
+ /// Tries to convert the `ScalarInt` to i16.
306
+ /// Fails if the size of the `ScalarInt` is unequal to `Size { raw: 2 }`
307
+ /// and returns the `ScalarInt`s size in that case.
308
+ pub fn try_to_i16 ( self ) -> Result < i16 , Size > {
309
+ self . try_to_int ( Size :: from_bits ( 16 ) ) . map ( |v| i16:: try_from ( v) . unwrap ( ) )
310
+ }
311
+
312
+ /// Tries to convert the `ScalarInt` to i32.
313
+ /// Fails if the size of the `ScalarInt` is unequal to `Size { raw: 4 }`
314
+ /// and returns the `ScalarInt`s size in that case.
315
+ pub fn try_to_i32 ( self ) -> Result < i32 , Size > {
316
+ self . try_to_int ( Size :: from_bits ( 32 ) ) . map ( |v| i32:: try_from ( v) . unwrap ( ) )
317
+ }
318
+
319
+ /// Tries to convert the `ScalarInt` to i64.
320
+ /// Fails if the size of the `ScalarInt` is unequal to `Size { raw: 8 }`
321
+ /// and returns the `ScalarInt`s size in that case.
322
+ pub fn try_to_i64 ( self ) -> Result < i64 , Size > {
323
+ self . try_to_int ( Size :: from_bits ( 64 ) ) . map ( |v| i64:: try_from ( v) . unwrap ( ) )
324
+ }
325
+
326
+ /// Tries to convert the `ScalarInt` to i128.
327
+ /// Fails if the size of the `ScalarInt` is unequal to `Size { raw: 16 }`
328
+ /// and returns the `ScalarInt`s size in that case.
329
+ pub fn try_to_i128 ( self ) -> Result < i128 , Size > {
330
+ self . try_to_int ( Size :: from_bits ( 128 ) ) . map ( |v| i128:: try_from ( v) . unwrap ( ) )
331
+ }
240
332
}
241
333
242
334
macro_rules! from {
0 commit comments