Skip to content

Commit 040da96

Browse files
Make floating point classify functions const fn
1 parent ba9588e commit 040da96

File tree

3 files changed

+39
-20
lines changed

3 files changed

+39
-20
lines changed

src/libcore/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
#![feature(const_panic)]
8686
#![feature(const_fn_union)]
8787
#![feature(const_float_bits_conv)]
88+
#![feature(const_float_classify)]
8889
#![feature(const_generics)]
8990
#![feature(const_ptr_offset_from)]
9091
#![feature(const_result)]

src/libcore/num/f32.rs

+17-9
Original file line numberDiff line numberDiff line change
@@ -381,16 +381,18 @@ impl f32 {
381381
/// assert!(!f.is_nan());
382382
/// ```
383383
#[stable(feature = "rust1", since = "1.0.0")]
384+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
384385
#[inline]
385-
pub fn is_nan(self) -> bool {
386+
pub const fn is_nan(self) -> bool {
386387
self != self
387388
}
388389

389390
// FIXME(#50145): `abs` is publicly unavailable in libcore due to
390391
// concerns about portability, so this implementation is for
391392
// private use internally.
393+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
392394
#[inline]
393-
fn abs_private(self) -> f32 {
395+
const fn abs_private(self) -> f32 {
394396
f32::from_bits(self.to_bits() & 0x7fff_ffff)
395397
}
396398

@@ -410,8 +412,9 @@ impl f32 {
410412
/// assert!(neg_inf.is_infinite());
411413
/// ```
412414
#[stable(feature = "rust1", since = "1.0.0")]
415+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
413416
#[inline]
414-
pub fn is_infinite(self) -> bool {
417+
pub const fn is_infinite(self) -> bool {
415418
self.abs_private() == Self::INFINITY
416419
}
417420

@@ -430,8 +433,9 @@ impl f32 {
430433
/// assert!(!neg_inf.is_finite());
431434
/// ```
432435
#[stable(feature = "rust1", since = "1.0.0")]
436+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
433437
#[inline]
434-
pub fn is_finite(self) -> bool {
438+
pub const fn is_finite(self) -> bool {
435439
// There's no need to handle NaN separately: if self is NaN,
436440
// the comparison is not true, exactly as desired.
437441
self.abs_private() < Self::INFINITY
@@ -457,9 +461,10 @@ impl f32 {
457461
/// ```
458462
/// [subnormal]: https://en.wikipedia.org/wiki/Denormal_number
459463
#[stable(feature = "rust1", since = "1.0.0")]
464+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
460465
#[inline]
461-
pub fn is_normal(self) -> bool {
462-
self.classify() == FpCategory::Normal
466+
pub const fn is_normal(self) -> bool {
467+
matches!(self.classify(), FpCategory::Normal)
463468
}
464469

465470
/// Returns the floating point category of the number. If only one property
@@ -476,7 +481,8 @@ impl f32 {
476481
/// assert_eq!(inf.classify(), FpCategory::Infinite);
477482
/// ```
478483
#[stable(feature = "rust1", since = "1.0.0")]
479-
pub fn classify(self) -> FpCategory {
484+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
485+
pub const fn classify(self) -> FpCategory {
480486
const EXP_MASK: u32 = 0x7f800000;
481487
const MAN_MASK: u32 = 0x007fffff;
482488

@@ -501,8 +507,9 @@ impl f32 {
501507
/// assert!(!g.is_sign_positive());
502508
/// ```
503509
#[stable(feature = "rust1", since = "1.0.0")]
510+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
504511
#[inline]
505-
pub fn is_sign_positive(self) -> bool {
512+
pub const fn is_sign_positive(self) -> bool {
506513
!self.is_sign_negative()
507514
}
508515

@@ -517,8 +524,9 @@ impl f32 {
517524
/// assert!(g.is_sign_negative());
518525
/// ```
519526
#[stable(feature = "rust1", since = "1.0.0")]
527+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
520528
#[inline]
521-
pub fn is_sign_negative(self) -> bool {
529+
pub const fn is_sign_negative(self) -> bool {
522530
// IEEE754 says: isSignMinus(x) is true if and only if x has negative sign. isSignMinus
523531
// applies to zeros and NaNs as well.
524532
self.to_bits() & 0x8000_0000 != 0

src/libcore/num/f64.rs

+21-11
Original file line numberDiff line numberDiff line change
@@ -380,16 +380,18 @@ impl f64 {
380380
/// assert!(!f.is_nan());
381381
/// ```
382382
#[stable(feature = "rust1", since = "1.0.0")]
383+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
383384
#[inline]
384-
pub fn is_nan(self) -> bool {
385+
pub const fn is_nan(self) -> bool {
385386
self != self
386387
}
387388

388389
// FIXME(#50145): `abs` is publicly unavailable in libcore due to
389390
// concerns about portability, so this implementation is for
390391
// private use internally.
391392
#[inline]
392-
fn abs_private(self) -> f64 {
393+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
394+
const fn abs_private(self) -> f64 {
393395
f64::from_bits(self.to_bits() & 0x7fff_ffff_ffff_ffff)
394396
}
395397

@@ -409,8 +411,9 @@ impl f64 {
409411
/// assert!(neg_inf.is_infinite());
410412
/// ```
411413
#[stable(feature = "rust1", since = "1.0.0")]
414+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
412415
#[inline]
413-
pub fn is_infinite(self) -> bool {
416+
pub const fn is_infinite(self) -> bool {
414417
self.abs_private() == Self::INFINITY
415418
}
416419

@@ -429,8 +432,9 @@ impl f64 {
429432
/// assert!(!neg_inf.is_finite());
430433
/// ```
431434
#[stable(feature = "rust1", since = "1.0.0")]
435+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
432436
#[inline]
433-
pub fn is_finite(self) -> bool {
437+
pub const fn is_finite(self) -> bool {
434438
// There's no need to handle NaN separately: if self is NaN,
435439
// the comparison is not true, exactly as desired.
436440
self.abs_private() < Self::INFINITY
@@ -456,9 +460,10 @@ impl f64 {
456460
/// ```
457461
/// [subnormal]: https://en.wikipedia.org/wiki/Denormal_number
458462
#[stable(feature = "rust1", since = "1.0.0")]
463+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
459464
#[inline]
460-
pub fn is_normal(self) -> bool {
461-
self.classify() == FpCategory::Normal
465+
pub const fn is_normal(self) -> bool {
466+
matches!(self.classify(), FpCategory::Normal)
462467
}
463468

464469
/// Returns the floating point category of the number. If only one property
@@ -475,7 +480,8 @@ impl f64 {
475480
/// assert_eq!(inf.classify(), FpCategory::Infinite);
476481
/// ```
477482
#[stable(feature = "rust1", since = "1.0.0")]
478-
pub fn classify(self) -> FpCategory {
483+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
484+
pub const fn classify(self) -> FpCategory {
479485
const EXP_MASK: u64 = 0x7ff0000000000000;
480486
const MAN_MASK: u64 = 0x000fffffffffffff;
481487

@@ -500,16 +506,18 @@ impl f64 {
500506
/// assert!(!g.is_sign_positive());
501507
/// ```
502508
#[stable(feature = "rust1", since = "1.0.0")]
509+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
503510
#[inline]
504-
pub fn is_sign_positive(self) -> bool {
511+
pub const fn is_sign_positive(self) -> bool {
505512
!self.is_sign_negative()
506513
}
507514

508515
#[stable(feature = "rust1", since = "1.0.0")]
516+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
509517
#[rustc_deprecated(since = "1.0.0", reason = "renamed to is_sign_positive")]
510518
#[inline]
511519
#[doc(hidden)]
512-
pub fn is_positive(self) -> bool {
520+
pub const fn is_positive(self) -> bool {
513521
self.is_sign_positive()
514522
}
515523

@@ -524,16 +532,18 @@ impl f64 {
524532
/// assert!(g.is_sign_negative());
525533
/// ```
526534
#[stable(feature = "rust1", since = "1.0.0")]
535+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
527536
#[inline]
528-
pub fn is_sign_negative(self) -> bool {
537+
pub const fn is_sign_negative(self) -> bool {
529538
self.to_bits() & 0x8000_0000_0000_0000 != 0
530539
}
531540

532541
#[stable(feature = "rust1", since = "1.0.0")]
542+
#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]
533543
#[rustc_deprecated(since = "1.0.0", reason = "renamed to is_sign_negative")]
534544
#[inline]
535545
#[doc(hidden)]
536-
pub fn is_negative(self) -> bool {
546+
pub const fn is_negative(self) -> bool {
537547
self.is_sign_negative()
538548
}
539549

0 commit comments

Comments
 (0)