1use std::fmt;
8
9pub use bb_ir::ids::{ComponentTag, OpsetId, PeerId, RequestId};
10
11macro_rules! u64_id {
14 ($(#[$attr:meta])* $name:ident) => {
15 $(#[$attr])*
16 #[derive(
17 Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord,
18 serde::Serialize, serde::Deserialize,
19 )]
20 #[repr(transparent)]
21 pub struct $name(u64);
22
23 impl $name {
24 pub const fn new(inner: u64) -> Self { Self(inner) }
26
27 pub const fn as_u64(self) -> u64 { self.0 }
29 }
30
31 impl fmt::Display for $name {
32 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
33 write!(f, "{}({})", stringify!($name), self.0)
34 }
35 }
36
37 impl From<u64> for $name {
38 fn from(inner: u64) -> Self { Self(inner) }
39 }
40 };
41}
42
43macro_rules! u32_id {
44 ($(#[$attr:meta])* $name:ident) => {
45 $(#[$attr])*
46 #[derive(
47 Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord,
48 serde::Serialize, serde::Deserialize,
49 )]
50 #[repr(transparent)]
51 pub struct $name(u32);
52
53 impl $name {
54 pub const fn new(inner: u32) -> Self { Self(inner) }
56
57 pub const fn as_u32(self) -> u32 { self.0 }
59 }
60
61 impl fmt::Display for $name {
62 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63 write!(f, "{}({})", stringify!($name), self.0)
64 }
65 }
66
67 impl From<u32> for $name {
68 fn from(inner: u32) -> Self { Self(inner) }
69 }
70 };
71}
72
73u64_id! {
76 NodeSiteId
79}
80
81u64_id! {
82 OpRef
86}
87
88impl OpRef {
89 pub const fn pack(graph_idx: u32, node_idx: u32) -> Self {
91 Self::new(((graph_idx as u64) << 32) | (node_idx as u64))
92 }
93
94 pub const fn split(self) -> (u32, u32) {
97 let v = self.as_u64();
98 ((v >> 32) as u32, v as u32)
99 }
100}
101
102u64_id! {
103 ExecId
106}
107
108u64_id! {
109 CommandId
112}
113
114u32_id! {
115 ComponentRef
117}
118