use alloc::format;
use iceoryx2_bb_derive_macros::ZeroCopySend;
use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;
use iceoryx2_bb_lock_free::mpmc::robust_unique_index_set::OwnerId;
use iceoryx2_bb_posix::unique_system_id::UniqueSystemId;
use iceoryx2_log::fatal_panic;
macro_rules! generate_id {
{ $(#[$documentation:meta])*
$id_name:ident } => {
$(#[$documentation])*
#[repr(C)]
#[derive(
Debug,
Eq,
Hash,
PartialEq,
Clone,
Copy,
PartialOrd,
Ord,
ZeroCopySend,
serde::Serialize,
serde::Deserialize,
)]
pub struct $id_name(pub(crate) UniqueSystemId);
impl core::fmt::Display for $id_name {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:x}", self.0.value())
}
}
impl $id_name {
pub(crate) fn new() -> Self {
Self(
fatal_panic!(from format!("{}::new()", stringify!($id_name)), when UniqueSystemId::new(),
"Unable to generate required {}!", stringify!($id_name)),
)
}
pub fn value(&self) -> u128 {
self.0.value()
}
pub fn pid(&self) -> iceoryx2_bb_posix::process::ProcessId {
self.0.pid()
}
pub fn creation_time(&self) -> iceoryx2_bb_posix::clock::Time {
self.0.creation_time()
}
}
};
}
generate_id! {
UniquePublisherId
}
generate_id! {
UniqueSubscriberId
}
generate_id! {
UniqueNotifierId
}
generate_id! {
UniqueListenerId
}
generate_id! {
UniqueClientId
}
generate_id! {
UniqueServerId
}
generate_id! {
UniqueReaderId
}
generate_id! {
UniqueWriterId
}
generate_id! {
UniqueServiceId
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UniquePortId {
Publisher(UniquePublisherId),
Subscriber(UniqueSubscriberId),
Notifier(UniqueNotifierId),
Listener(UniqueListenerId),
Client(UniqueClientId),
Server(UniqueServerId),
Reader(UniqueReaderId),
Writer(UniqueWriterId),
}
impl UniquePortId {
pub fn value(&self) -> u128 {
match self {
UniquePortId::Publisher(v) => v.value(),
UniquePortId::Subscriber(v) => v.value(),
UniquePortId::Notifier(v) => v.value(),
UniquePortId::Listener(v) => v.value(),
UniquePortId::Client(v) => v.value(),
UniquePortId::Server(v) => v.value(),
UniquePortId::Reader(v) => v.value(),
UniquePortId::Writer(v) => v.value(),
}
}
}
#[repr(C)]
#[derive(
Debug,
Eq,
Hash,
PartialEq,
Clone,
Copy,
PartialOrd,
Ord,
ZeroCopySend,
serde::Serialize,
serde::Deserialize,
)]
pub struct UniqueNodeId(pub(crate) UniqueSystemId);
impl core::fmt::Display for UniqueNodeId {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:x}", self.0.value())
}
}
impl UniqueNodeId {
pub(crate) fn new(counter: u32) -> Self {
Self(fatal_panic!(from "UniqueNodeId::new",
when UniqueSystemId::from_counter(counter),
"Unable to generate required UniqueNodeId!"))
}
pub fn value(&self) -> u128 {
self.0.value()
}
pub fn pid(&self) -> iceoryx2_bb_posix::process::ProcessId {
self.0.pid()
}
pub fn creation_time(&self) -> iceoryx2_bb_posix::clock::Time {
self.0.creation_time()
}
pub(crate) fn owner_id(&self) -> OwnerId {
OwnerId::new((self.0.pid().value() as u64) << 32 | self.0.counter() as u64)
.expect("The unique node id is never 0")
}
}