@@ -249,11 +249,6 @@ impl ScalarInt {
249249 }
250250 }
251251
252- #[inline]
253- pub fn try_to_target_usize(&self, tcx: TyCtxt<'_>) -> Result<u64, Size> {
254- Ok(self.to_bits(tcx.data_layout.pointer_size)? as u64)
255- }
256-
257252 /// Tries to convert the `ScalarInt` to an unsigned integer of the given size.
258253 /// Fails if the size of the `ScalarInt` is not equal to `size` and returns the
259254 /// `ScalarInt`s size in that case.
@@ -262,56 +257,61 @@ impl ScalarInt {
262257 self.to_bits(size)
263258 }
264259
265- // Tries to convert the `ScalarInt` to `bool`. Fails if the `size` of the `ScalarInt`
266- // in not equal to `Size { raw: 1 }` or if the value is not 0 or 1 and returns the `size`
267- // value of the `ScalarInt` in that case.
268- #[inline]
269- pub fn try_to_bool(self) -> Result<bool, Size> {
270- match self.try_to_u8()? {
271- 0 => Ok(false),
272- 1 => Ok(true),
273- _ => Err(self.size()),
274- }
275- }
276-
277260 // Tries to convert the `ScalarInt` to `u8`. Fails if the `size` of the `ScalarInt`
278261 // in not equal to `Size { raw: 1 }` and returns the `size` value of the `ScalarInt` in
279262 // that case.
280263 #[inline]
281264 pub fn try_to_u8(self) -> Result<u8, Size> {
282- self.to_bits (Size::from_bits(8)).map(|v| u8::try_from(v).unwrap())
265+ self.try_to_uint (Size::from_bits(8)).map(|v| u8::try_from(v).unwrap())
283266 }
284267
285268 /// Tries to convert the `ScalarInt` to `u16`. Fails if the size of the `ScalarInt`
286269 /// in not equal to `Size { raw: 2 }` and returns the `size` value of the `ScalarInt` in
287270 /// that case.
288271 #[inline]
289272 pub fn try_to_u16(self) -> Result<u16, Size> {
290- self.to_bits (Size::from_bits(16)).map(|v| u16::try_from(v).unwrap())
273+ self.try_to_uint (Size::from_bits(16)).map(|v| u16::try_from(v).unwrap())
291274 }
292275
293276 /// Tries to convert the `ScalarInt` to `u32`. Fails if the `size` of the `ScalarInt`
294277 /// in not equal to `Size { raw: 4 }` and returns the `size` value of the `ScalarInt` in
295278 /// that case.
296279 #[inline]
297280 pub fn try_to_u32(self) -> Result<u32, Size> {
298- self.to_bits (Size::from_bits(32)).map(|v| u32::try_from(v).unwrap())
281+ self.try_to_uint (Size::from_bits(32)).map(|v| u32::try_from(v).unwrap())
299282 }
300283
301284 /// Tries to convert the `ScalarInt` to `u64`. Fails if the `size` of the `ScalarInt`
302285 /// in not equal to `Size { raw: 8 }` and returns the `size` value of the `ScalarInt` in
303286 /// that case.
304287 #[inline]
305288 pub fn try_to_u64(self) -> Result<u64, Size> {
306- self.to_bits (Size::from_bits(64)).map(|v| u64::try_from(v).unwrap())
289+ self.try_to_uint (Size::from_bits(64)).map(|v| u64::try_from(v).unwrap())
307290 }
308291
309292 /// Tries to convert the `ScalarInt` to `u128`. Fails if the `size` of the `ScalarInt`
310293 /// in not equal to `Size { raw: 16 }` and returns the `size` value of the `ScalarInt` in
311294 /// that case.
312295 #[inline]
313296 pub fn try_to_u128(self) -> Result<u128, Size> {
314- self.to_bits(Size::from_bits(128))
297+ self.try_to_uint(Size::from_bits(128))
298+ }
299+
300+ #[inline]
301+ pub fn try_to_target_usize(&self, tcx: TyCtxt<'_>) -> Result<u64, Size> {
302+ self.try_to_uint(tcx.data_layout.pointer_size).map(|v| u64::try_from(v).unwrap())
303+ }
304+
305+ // Tries to convert the `ScalarInt` to `bool`. Fails if the `size` of the `ScalarInt`
306+ // in not equal to `Size { raw: 1 }` or if the value is not 0 or 1 and returns the `size`
307+ // value of the `ScalarInt` in that case.
308+ #[inline]
309+ pub fn try_to_bool(self) -> Result<bool, Size> {
310+ match self.try_to_u8()? {
311+ 0 => Ok(false),
312+ 1 => Ok(true),
313+ _ => Err(self.size()),
314+ }
315315 }
316316
317317 /// Tries to convert the `ScalarInt` to a signed integer of the given size.
@@ -357,6 +357,27 @@ impl ScalarInt {
357357 pub fn try_to_i128(self) -> Result<i128, Size> {
358358 self.try_to_int(Size::from_bits(128))
359359 }
360+
361+ #[inline]
362+ pub fn try_to_target_isize(&self, tcx: TyCtxt<'_>) -> Result<i64, Size> {
363+ self.try_to_int(tcx.data_layout.pointer_size).map(|v| i64::try_from(v).unwrap())
364+ }
365+
366+ #[inline]
367+ pub fn try_to_float<F: Float>(self) -> Result<F, Size> {
368+ // Going through `to_uint` to check size and truncation.
369+ Ok(F::from_bits(self.to_bits(Size::from_bits(F::BITS))?))
370+ }
371+
372+ #[inline]
373+ pub fn try_to_f32(self) -> Result<Single, Size> {
374+ self.try_to_float()
375+ }
376+
377+ #[inline]
378+ pub fn try_to_f64(self) -> Result<Double, Size> {
379+ self.try_to_float()
380+ }
360381}
361382
362383macro_rules! from {
@@ -399,11 +420,7 @@ impl TryFrom<ScalarInt> for bool {
399420 type Error = Size;
400421 #[inline]
401422 fn try_from(int: ScalarInt) -> Result<Self, Size> {
402- int.to_bits(Size::from_bytes(1)).and_then(|u| match u {
403- 0 => Ok(false),
404- 1 => Ok(true),
405- _ => Err(Size::from_bytes(1)),
406- })
423+ int.try_to_bool()
407424 }
408425}
409426
0 commit comments