kvstructs/
raw_key_pointer.rs

1use crate::{Key, KeyExt, KeyRef};
2use core::cmp::Ordering;
3use core::hash::{Hash, Hasher};
4use core::ops::Deref;
5use core::slice;
6
7/// RawKeyPointer contains a raw pointer of the data slice of [`Key`]
8/// This struct is unsafe, because it does not promise the raw pointer always valid.
9///
10/// [`Key`]: struct.Key.html
11#[derive(Debug, Copy, Clone)]
12pub struct RawKeyPointer {
13    ptr: *const u8,
14    l: u32,
15}
16
17impl From<Key> for RawKeyPointer {
18    fn from(k: Key) -> Self {
19        RawKeyPointer {
20            ptr: k.as_slice().as_ptr(),
21            l: k.as_slice().len() as u32,
22        }
23    }
24}
25
26impl<'a> From<KeyRef<'a>> for RawKeyPointer {
27    fn from(k: KeyRef<'a>) -> Self {
28        Self {
29            ptr: k.as_slice().as_ptr(),
30            l: k.as_slice().len() as u32,
31        }
32    }
33}
34
35impl RawKeyPointer {
36    /// Returns a RawKeyPointer
37    ///
38    /// # Safety
39    /// The inner raw pointer must be valid.
40    #[inline(always)]
41    pub const unsafe fn new(ptr: *const u8, len: u32) -> Self {
42        Self { ptr, l: len }
43    }
44
45    /// Converts RawKeyPointer to KeyRef
46    ///
47    /// # Safety
48    /// The inner raw pointer must be valid.
49    #[inline(always)]
50    pub unsafe fn as_key_ref(&self) -> KeyRef<'_> {
51        KeyRef::from(self as &[u8])
52    }
53}
54
55impl Deref for RawKeyPointer {
56    type Target = [u8];
57
58    fn deref(&self) -> &Self::Target {
59        unsafe { slice::from_raw_parts(self.ptr, self.l as usize) }
60    }
61}
62
63impl KeyExt for RawKeyPointer {
64    #[inline]
65    fn as_bytes(&self) -> &[u8] {
66        self
67    }
68}
69
70impl Hash for RawKeyPointer {
71    fn hash<H: Hasher>(&self, state: &mut H) {
72        unsafe { self.as_key_ref().hash(state) }
73    }
74}
75
76impl PartialEq<RawKeyPointer> for RawKeyPointer {
77    fn eq(&self, other: &RawKeyPointer) -> bool {
78        unsafe { self.as_key_ref().eq(&other.as_key_ref()) }
79    }
80}
81
82impl Eq for RawKeyPointer {}
83
84impl PartialOrd<RawKeyPointer> for RawKeyPointer {
85    fn partial_cmp(&self, other: &RawKeyPointer) -> Option<Ordering> {
86        unsafe { self.as_key_ref().partial_cmp(&other.as_key_ref()) }
87    }
88}
89
90impl Ord for RawKeyPointer {
91    fn cmp(&self, other: &Self) -> Ordering {
92        unsafe { self.as_key_ref().cmp(&other.as_key_ref()) }
93    }
94}