1use core::cmp::Ordering;
2use mem_eq::*;
3use mem_ord::*;
4
5#[derive(Clone, Copy, Debug, Default, Hash)]
20pub struct MemOrdered<T: ?Sized>(pub T);
21
22impl<T> MemOrdered<T> {
28    #[inline]
30    pub fn from_slice(slice: &[T]) -> &[MemOrdered<T>] {
31        unsafe { &*(slice as *const _ as *const _) }
32    }
33
34    #[inline]
36    pub fn from_mut_slice(slice: &mut [T]) -> &mut [MemOrdered<T>] {
37        unsafe { &mut *(slice as *mut _ as *mut _) }
38    }
39}
40
41impl<T> From<T> for MemOrdered<T> {
42    #[inline]
43    fn from(inner: T) -> Self { MemOrdered(inner) }
44}
45
46impl<'a, T: ?Sized> From<&'a T> for &'a MemOrdered<T> {
47    #[inline]
48    fn from(inner: &T) -> Self {
49        unsafe { &*(inner as *const T as *const _) }
50    }
51}
52
53impl<'a, T: ?Sized> From<&'a mut T> for &'a mut MemOrdered<T> {
54    #[inline]
55    fn from(inner: &mut T) -> Self {
56        unsafe { &mut *(inner as *mut T as *mut _) }
57    }
58}
59
60impl<T: ?Sized> AsRef<T> for MemOrdered<T> {
61    #[inline]
62    fn as_ref(&self) -> &T { &self.0 }
63}
64
65impl<T: ?Sized> AsMut<T> for MemOrdered<T> {
66    #[inline]
67    fn as_mut(&mut self) -> &mut T { &mut self.0 }
68}
69
70impl<T: ?Sized, U: ?Sized> PartialEq<MemOrdered<U>> for MemOrdered<T>
71    where T: MemEq<U>
72{
73    #[inline]
74    fn eq(&self, other: &MemOrdered<U>) -> bool {
75        self.0.mem_eq(&other.0)
76    }
77}
78
79impl<T> Eq for MemOrdered<T> {}
80
81impl<T: ?Sized, U: ?Sized> PartialOrd<MemOrdered<U>> for MemOrdered<T>
82    where T: MemOrd<U>
83{
84    #[inline]
85    fn partial_cmp(&self, other: &MemOrdered<U>) -> Option<Ordering> {
86        Some(self.0.mem_cmp(&other.0))
87    }
88}
89
90impl<T: MemOrd> Ord for MemOrdered<T> {
91    #[inline]
92    fn cmp(&self, other: &Self) -> Ordering {
93        self.0.mem_cmp(&other.0)
94    }
95}