use std::{
rc::Rc,
sync::atomic::{AtomicUsize, Ordering},
};
use super::Named;
static NODE_ID: AtomicUsize = AtomicUsize::new(0);
#[doc(hidden)]
pub fn next_node_id() -> usize {
NODE_ID.fetch_add(1, Ordering::Relaxed)
}
#[cfg(test)]
pub fn reset_node_id() {
NODE_ID.store(0, Ordering::Relaxed);
}
#[allow(unused)]
pub unsafe fn ext_reset_node_id() {
NODE_ID.store(0, Ordering::Relaxed);
}
pub trait Identifiable: Named {
fn id(&self) -> usize;
}
impl<T> Identifiable for Rc<T>
where
T: Identifiable,
{
fn id(&self) -> usize {
T::id(self)
}
}
#[cfg(test)]
mod tests {
use serial_test::serial;
use super::*;
use crate::execution::{internal_test_utils::TestData, InputNode};
#[test]
#[serial]
fn test_identifiable_rc() {
reset_node_id();
for i in 0..32 {
let node = InputNode::new(TestData::new(i));
let rc = Rc::new(node);
assert_eq!(rc.id(), i as usize);
}
}
#[test]
#[serial]
fn test_next_node_id() {
reset_node_id();
for i in 0..32_usize {
assert_eq!(next_node_id(), i);
}
}
}