Skip to main content

pb_mapper_core/
conn_id.rs

1use std::fmt::{Debug, Display};
2use std::hash::Hash;
3use std::ops::AddAssign;
4
5#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub struct RemoteConnId(u32);
7
8#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub struct LocalConnId(u32);
10
11impl LocalConnId {
12    pub const fn from_u32(data: u32) -> Self {
13        Self(data)
14    }
15}
16
17pub trait ConnIdTrait:
18    Copy + Clone + Debug + Display + Hash + PartialEq + Eq + PartialOrd + Ord + Default + Into<u32>
19{
20}
21
22pub trait ConnIdProvider<T: ConnIdTrait> {
23    fn get_next_id(&mut self) -> T;
24    fn is_valid_id(&self, id: &T) -> bool;
25}
26
27macro_rules! impl_tuple_from_primitive {
28    ($primitive_ty:ident, $tuple_ty:ident) => {
29        impl From<$primitive_ty> for $tuple_ty {
30            fn from(value: $primitive_ty) -> Self {
31                Self(value)
32            }
33        }
34    };
35}
36
37macro_rules! impl_primitive_from_tupe {
38    ($primitive_ty:ident, $tuple_ty:ident) => {
39        impl From<$tuple_ty> for $primitive_ty {
40            fn from(value: $tuple_ty) -> Self {
41                value.0
42            }
43        }
44    };
45}
46
47macro_rules! impl_tuple_add_assign_primitive {
48    ($primitive_ty:ident, $tuple_ty:ident) => {
49        impl AddAssign<$primitive_ty> for $tuple_ty {
50            fn add_assign(&mut self, rhs: $primitive_ty) {
51                self.0 += rhs
52            }
53        }
54    };
55}
56
57impl_tuple_from_primitive!(u32, RemoteConnId);
58
59impl_primitive_from_tupe!(u32, RemoteConnId);
60
61impl_tuple_add_assign_primitive!(u32, RemoteConnId);
62
63impl_tuple_from_primitive!(u32, LocalConnId);
64
65impl_primitive_from_tupe!(u32, LocalConnId);
66
67impl_tuple_add_assign_primitive!(u32, LocalConnId);
68
69impl Display for RemoteConnId {
70    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71        write!(f, "RemoteConnId({})", self.0)
72    }
73}
74
75impl Display for LocalConnId {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        write!(f, "LocalConnId({})", self.0)
78    }
79}
80
81impl ConnIdTrait for RemoteConnId {}
82impl ConnIdTrait for LocalConnId {}
83
84#[derive(Debug, Clone, Copy, Hash)]
85pub struct ConnId {
86    pub local_id: LocalConnId,
87    pub remote_id: RemoteConnId,
88}
89
90impl Display for ConnId {
91    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
92        write!(f, "`L-{}:R-{}`", self.local_id, self.remote_id)
93    }
94}