1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use core::cmp::Ordering;
use core::mem;
use mem_eq::*;
use mem_ord::*;
pub struct MemOrdered<T: ?Sized>(pub T);
impl<T> From<T> for MemOrdered<T> {
fn from(inner: T) -> Self { MemOrdered(inner) }
}
impl<'a, T: ?Sized> From<&'a T> for &'a MemOrdered<T> {
fn from(inner: &T) -> Self { unsafe { mem::transmute(inner) } }
}
impl<'a, T: ?Sized> From<&'a mut T> for &'a mut MemOrdered<T> {
fn from(inner: &mut T) -> Self { unsafe { mem::transmute(inner) } }
}
impl<T: ?Sized> AsRef<T> for MemOrdered<T> {
fn as_ref(&self) -> &T { &self.0 }
}
impl<T: ?Sized> AsMut<T> for MemOrdered<T> {
fn as_mut(&mut self) -> &mut T { &mut self.0 }
}
impl<T: ?Sized, U: ?Sized> PartialEq<MemOrdered<U>> for MemOrdered<T>
where T: MemEq<U>
{
fn eq(&self, other: &MemOrdered<U>) -> bool {
self.0.mem_eq(&other.0)
}
}
impl<T> Eq for MemOrdered<T> {}
impl<T: ?Sized + MemOrd> PartialOrd for MemOrdered<T> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.0.mem_cmp(&other.0))
}
}
impl<T: MemOrd> Ord for MemOrdered<T> {
fn cmp(&self, other: &Self) -> Ordering {
self.0.mem_cmp(&other.0)
}
}