Unrolled build for #138135 · rust-lang/rust@8115bc1 (original) (raw)
`@@ -29,6 +29,7 @@ mod bytewise;
`
29
29
`pub(crate) use bytewise::BytewiseEq;
`
30
30
``
31
31
`use self::Ordering::*;
`
``
32
`+
use crate::ops::ControlFlow;
`
32
33
``
33
34
`/// Trait for comparisons using the equality operator.
`
34
35
`///
`
`@@ -1435,6 +1436,67 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq {
`
1435
1436
`fn ge(&self, other: &Rhs) -> bool {
`
1436
1437
`self.partial_cmp(other).is_some_and(Ordering::is_ge)
`
1437
1438
`}
`
``
1439
+
``
1440
`` +
/// If self == other
, returns ControlFlow::Continue(())
.
``
``
1441
`` +
/// Otherwise, returns ControlFlow::Break(self < other)
.
``
``
1442
`+
///
`
``
1443
`+
/// This is useful for chaining together calls when implementing a lexical
`
``
1444
`` +
/// PartialOrd::lt
, as it allows types (like primitives) which can cheaply
``
``
1445
`` +
/// check ==
and <
separately to do rather than needing to calculate
``
``
1446
`` +
/// (then optimize out) the three-way Ordering
result.
``
``
1447
`+
#[inline]
`
``
1448
`+
#[must_use]
`
``
1449
`+
// Added to improve the behaviour of tuples; not necessarily stabilization-track.
`
``
1450
`+
#[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
`
``
1451
`+
#[doc(hidden)]
`
``
1452
`+
fn __chaining_lt(&self, other: &Rhs) -> ControlFlow {
`
``
1453
`+
default_chaining_impl(self, other, Ordering::is_lt)
`
``
1454
`+
}
`
``
1455
+
``
1456
`` +
/// Same as __chaining_lt
, but for <=
instead of <
.
``
``
1457
`+
#[inline]
`
``
1458
`+
#[must_use]
`
``
1459
`+
#[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
`
``
1460
`+
#[doc(hidden)]
`
``
1461
`+
fn __chaining_le(&self, other: &Rhs) -> ControlFlow {
`
``
1462
`+
default_chaining_impl(self, other, Ordering::is_le)
`
``
1463
`+
}
`
``
1464
+
``
1465
`` +
/// Same as __chaining_lt
, but for >
instead of <
.
``
``
1466
`+
#[inline]
`
``
1467
`+
#[must_use]
`
``
1468
`+
#[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
`
``
1469
`+
#[doc(hidden)]
`
``
1470
`+
fn __chaining_gt(&self, other: &Rhs) -> ControlFlow {
`
``
1471
`+
default_chaining_impl(self, other, Ordering::is_gt)
`
``
1472
`+
}
`
``
1473
+
``
1474
`` +
/// Same as __chaining_lt
, but for >=
instead of <
.
``
``
1475
`+
#[inline]
`
``
1476
`+
#[must_use]
`
``
1477
`+
#[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
`
``
1478
`+
#[doc(hidden)]
`
``
1479
`+
fn __chaining_ge(&self, other: &Rhs) -> ControlFlow {
`
``
1480
`+
default_chaining_impl(self, other, Ordering::is_ge)
`
``
1481
`+
}
`
``
1482
`+
}
`
``
1483
+
``
1484
`+
fn default_chaining_impl<T: ?Sized, U: ?Sized>(
`
``
1485
`+
lhs: &T,
`
``
1486
`+
rhs: &U,
`
``
1487
`+
p: impl FnOnce(Ordering) -> bool,
`
``
1488
`+
) -> ControlFlow
`
``
1489
`+
where
`
``
1490
`+
T: PartialOrd,
`
``
1491
`+
{
`
``
1492
`` +
// It's important that this only call partial_cmp
once, not call eq
then
``
``
1493
`` +
// one of the relational operators. We don't want to bcmp
-then-memcp
a
``
``
1494
`` +
// String
, for example, or similarly for other data structures (#108157).
``
``
1495
`+
match <T as PartialOrd>::partial_cmp(lhs, rhs) {
`
``
1496
`+
Some(Equal) => ControlFlow::Continue(()),
`
``
1497
`+
Some(c) => ControlFlow::Break(p(c)),
`
``
1498
`+
None => ControlFlow::Break(false),
`
``
1499
`+
}
`
1438
1500
`}
`
1439
1501
``
1440
1502
`` /// Derive macro generating an impl of the trait [PartialOrd
].
``
`@@ -1741,6 +1803,7 @@ where
`
1741
1803
`mod impls {
`
1742
1804
`use crate::cmp::Ordering::{self, Equal, Greater, Less};
`
1743
1805
`use crate::hint::unreachable_unchecked;
`
``
1806
`+
use crate::ops::ControlFlow::{self, Break, Continue};
`
1744
1807
``
1745
1808
`macro_rules! partial_eq_impl {
`
1746
1809
`($($t:ty)*) => ($(
`
`@@ -1779,6 +1842,35 @@ mod impls {
`
1779
1842
``
1780
1843
`eq_impl! { () bool char usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
`
1781
1844
``
``
1845
`+
macro_rules! chaining_methods_impl {
`
``
1846
`+
($t:ty) => {
`
``
1847
`` +
// These implementations are the same for Ord
or PartialOrd
types
``
``
1848
`` +
// because if either is NAN the ==
test will fail so we end up in
``
``
1849
`` +
// the Break
case and the comparison will correctly return false
.
``
``
1850
+
``
1851
`+
#[inline]
`
``
1852
`+
fn __chaining_lt(&self, other: &Self) -> ControlFlow {
`
``
1853
`+
let (lhs, rhs) = (*self, *other);
`
``
1854
`+
if lhs == rhs { Continue(()) } else { Break(lhs < rhs) }
`
``
1855
`+
}
`
``
1856
`+
#[inline]
`
``
1857
`+
fn __chaining_le(&self, other: &Self) -> ControlFlow {
`
``
1858
`+
let (lhs, rhs) = (*self, *other);
`
``
1859
`+
if lhs == rhs { Continue(()) } else { Break(lhs <= rhs) }
`
``
1860
`+
}
`
``
1861
`+
#[inline]
`
``
1862
`+
fn __chaining_gt(&self, other: &Self) -> ControlFlow {
`
``
1863
`+
let (lhs, rhs) = (*self, *other);
`
``
1864
`+
if lhs == rhs { Continue(()) } else { Break(lhs > rhs) }
`
``
1865
`+
}
`
``
1866
`+
#[inline]
`
``
1867
`+
fn __chaining_ge(&self, other: &Self) -> ControlFlow {
`
``
1868
`+
let (lhs, rhs) = (*self, *other);
`
``
1869
`+
if lhs == rhs { Continue(()) } else { Break(lhs >= rhs) }
`
``
1870
`+
}
`
``
1871
`+
};
`
``
1872
`+
}
`
``
1873
+
1782
1874
`macro_rules! partial_ord_impl {
`
1783
1875
`($($t:ty)*) => ($(
`
1784
1876
` #[stable(feature = "rust1", since = "1.0.0")]
`
`@@ -1800,6 +1892,8 @@ mod impls {
`
1800
1892
`fn ge(&self, other: &$t) -> bool { (*self) >= (*other) }
`
1801
1893
` #[inline(always)]
`
1802
1894
`fn gt(&self, other: &$t) -> bool { (*self) > (*other) }
`
``
1895
+
``
1896
`+
chaining_methods_impl!($t);
`
1803
1897
`}
`
1804
1898
`)*)
`
1805
1899
`}
`
`@@ -1838,6 +1932,8 @@ mod impls {
`
1838
1932
`fn ge(&self, other: &$t) -> bool { (*self) >= (*other) }
`
1839
1933
` #[inline(always)]
`
1840
1934
`fn gt(&self, other: &$t) -> bool { (*self) > (*other) }
`
``
1935
+
``
1936
`+
chaining_methods_impl!($t);
`
1841
1937
`}
`
1842
1938
``
1843
1939
` #[stable(feature = "rust1", since = "1.0.0")]
`