diff --git a/src/libcore/pin.rs b/src/libcore/pin.rs index 762e07549a52a..022481f463514 100644 --- a/src/libcore/pin.rs +++ b/src/libcore/pin.rs @@ -99,6 +99,7 @@ use fmt; use marker::{Sized, Unpin}; +use cmp::{self, PartialEq, PartialOrd}; use ops::{Deref, DerefMut, Receiver, CoerceUnsized, DispatchFromDyn}; /// A pinned pointer. @@ -112,16 +113,59 @@ use ops::{Deref, DerefMut, Receiver, CoerceUnsized, DispatchFromDyn}; /// [`Unpin`]: ../../std/marker/trait.Unpin.html /// [`pin` module]: ../../std/pin/index.html // -// Note: the derives below are allowed because they all only use `&P`, so they -// cannot move the value behind `pointer`. +// Note: the derives below, and the explicit `PartialEq` and `PartialOrd` +// implementations, are allowed because they all only use `&P`, so they cannot move +// the value behind `pointer`. #[stable(feature = "pin", since = "1.33.0")] #[fundamental] #[repr(transparent)] -#[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] +#[derive(Copy, Clone, Hash, Eq, Ord)] pub struct Pin
{ pointer: P, } +#[stable(feature = "pin_partialeq_partialord_impl_applicability", since = "1.34.0")] +impl
PartialEq
+where
+ P: PartialEq PartialOrd
+where
+ P: PartialOrd
where
P::Target: Unpin,
,
+{
+
+ fn eq(&self, other: &Pin
) -> bool {
+ self.pointer == other.pointer
+ }
+
+ fn ne(&self, other: &Pin
) -> bool {
+ self.pointer != other.pointer
+ }
+}
+
+#[stable(feature = "pin_partialeq_partialord_impl_applicability", since = "1.34.0")]
+impl
,
+{
+
+ fn partial_cmp(&self, other: &Pin
) -> Option
) -> bool {
+ self.pointer < other.pointer
+ }
+
+ fn le(&self, other: &Pin
) -> bool {
+ self.pointer <= other.pointer
+ }
+
+ fn gt(&self, other: &Pin
) -> bool {
+ self.pointer > other.pointer
+ }
+
+ fn ge(&self, other: &Pin
) -> bool {
+ self.pointer >= other.pointer
+ }
+}
+
impl