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}