kvbm_physical/manager/
handle.rs1use bincode::{Decode, Encode};
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Encode, Decode, Serialize, Deserialize)]
16pub struct LayoutHandle(u128);
17
18impl LayoutHandle {
19 pub fn new(worker_id: u64, layout_id: u16) -> Self {
25 let handle = (worker_id as u128) | ((layout_id as u128) << 64);
26 Self(handle)
27 }
28
29 pub fn worker_id(&self) -> u64 {
31 (self.0 & 0xFFFF_FFFF_FFFF_FFFF) as u64
32 }
33
34 pub fn layout_id(&self) -> u16 {
36 ((self.0 >> 64) & 0xFFFF) as u16
37 }
38
39 pub fn as_u128(&self) -> u128 {
41 self.0
42 }
43
44 pub fn from_u128(value: u128) -> Self {
49 Self(value)
50 }
51}
52
53impl std::fmt::Display for LayoutHandle {
54 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
55 write!(
56 f,
57 "LayoutHandle(worker={}, layout={})",
58 self.worker_id(),
59 self.layout_id()
60 )
61 }
62}
63
64#[cfg(all(test, feature = "testing-kvbm"))]
65mod tests {
66 use super::*;
67
68 #[test]
69 fn test_handle_encoding() {
70 let worker_id = 0x1234_5678_9ABC_DEF0u64;
71 let layout_id = 0x4242u16;
72
73 let handle = LayoutHandle::new(worker_id, layout_id);
74
75 assert_eq!(handle.worker_id(), worker_id);
76 assert_eq!(handle.layout_id(), layout_id);
77 }
78
79 #[test]
80 fn test_handle_roundtrip() {
81 let handle = LayoutHandle::new(42, 100);
82 let raw = handle.as_u128();
83 let restored = LayoutHandle::from_u128(raw);
84
85 assert_eq!(handle, restored);
86 assert_eq!(restored.worker_id(), 42);
87 assert_eq!(restored.layout_id(), 100);
88 }
89
90 #[test]
91 fn test_handle_max_values() {
92 let max_worker = u64::MAX;
93 let max_layout = u16::MAX;
94
95 let handle = LayoutHandle::new(max_worker, max_layout);
96
97 assert_eq!(handle.worker_id(), max_worker);
98 assert_eq!(handle.layout_id(), max_layout);
99 }
100
101 #[test]
102 fn test_handle_bincode_roundtrip() {
103 let handle = LayoutHandle::new(999, 42);
104
105 let encoded = bincode::encode_to_vec(handle, bincode::config::standard()).unwrap();
106 let (decoded, _): (LayoutHandle, _) =
107 bincode::decode_from_slice(&encoded, bincode::config::standard()).unwrap();
108
109 assert_eq!(handle, decoded);
110 }
111
112 #[test]
113 fn test_handle_display() {
114 let handle = LayoutHandle::new(123, 456);
115 let display = format!("{}", handle);
116 assert!(display.contains("123"));
117 assert!(display.contains("456"));
118 }
119}