kvstructs/
raw_key_pointer.rs1use crate::{Key, KeyExt, KeyRef};
2use core::cmp::Ordering;
3use core::hash::{Hash, Hasher};
4use core::ops::Deref;
5use core::slice;
6
7#[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 #[inline(always)]
41 pub const unsafe fn new(ptr: *const u8, len: u32) -> Self {
42 Self { ptr, l: len }
43 }
44
45 #[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}