use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Clone)]
pub(crate) struct QueryID {
id: Arc<AtomicU64>,
}
const QUERY_START: u64 = 0x0000ffffffffffffu64;
const QUERY_STOP: u64 = 0x0fffffffffffffffu64;
impl Default for QueryID {
fn default() -> Self {
Self { id: Arc::new(AtomicU64::new(QUERY_START)) }
}
}
impl QueryID {
pub(crate) fn get(&self) -> u64 {
let id = self.id.fetch_add(1, std::sync::atomic::Ordering::AcqRel);
let _ = self.id.compare_exchange(QUERY_STOP, QUERY_START, Ordering::Acquire, Ordering::Relaxed);
id
}
}