Skip to main content

plc_ast/
provider.rs

1use std::sync::{
2    atomic::{AtomicUsize, Ordering},
3    Arc,
4};
5
6use serde::{Deserialize, Serialize};
7
8use crate::ast::AstId;
9
10#[derive(Debug, Clone, Deserialize, Serialize)]
11pub struct IdProvider {
12    current_id: Arc<AtomicUsize>,
13}
14
15impl IdProvider {
16    pub fn next_id(&mut self) -> AstId {
17        self.current_id.fetch_add(1, Ordering::Relaxed)
18    }
19}
20
21impl Default for IdProvider {
22    fn default() -> Self {
23        IdProvider { current_id: Arc::new(AtomicUsize::new(1)) }
24    }
25}
26
27#[cfg(test)]
28mod id_tests {
29    use super::IdProvider;
30
31    #[test]
32    fn id_provider_generates_unique_ids_over_clones() {
33        let mut id1 = IdProvider::default();
34        let mut id2 = id1.clone();
35
36        assert_eq!(id1.next_id(), 1);
37        assert_eq!(id2.next_id(), 2);
38        assert_eq!(id1.next_id(), 3);
39        assert_eq!(id2.next_id(), 4);
40    }
41}