use std::sync::atomic::{AtomicI32, Ordering};
const INITIAL_REQUEST_ID: i32 = 9000;
#[derive(Debug)]
pub(crate) struct IdGenerator {
next_id: AtomicI32,
}
impl IdGenerator {
pub(crate) fn new(start: i32) -> Self {
Self {
next_id: AtomicI32::new(start),
}
}
pub(crate) fn new_request_id_generator() -> Self {
Self::new(INITIAL_REQUEST_ID)
}
pub(crate) fn new_order_id_generator(start: i32) -> Self {
Self::new(start)
}
pub(crate) fn next(&self) -> i32 {
self.next_id.fetch_add(1, Ordering::Relaxed)
}
#[allow(dead_code)]
pub(crate) fn current(&self) -> i32 {
self.next_id.load(Ordering::Relaxed)
}
pub(crate) fn set(&self, value: i32) {
self.next_id.store(value, Ordering::Relaxed);
}
#[allow(dead_code)]
pub(crate) fn reset(&self, start: i32) {
self.set(start);
}
}
impl Default for IdGenerator {
fn default() -> Self {
Self::new(0)
}
}
#[derive(Debug)]
pub(crate) struct ClientIdManager {
request_ids: IdGenerator,
order_ids: IdGenerator,
}
impl ClientIdManager {
pub(crate) fn new(initial_order_id: i32) -> Self {
Self {
request_ids: IdGenerator::new_request_id_generator(),
order_ids: IdGenerator::new_order_id_generator(initial_order_id),
}
}
pub(crate) fn next_request_id(&self) -> i32 {
self.request_ids.next()
}
pub(crate) fn next_order_id(&self) -> i32 {
self.order_ids.next()
}
pub(crate) fn set_order_id(&self, order_id: i32) {
self.order_ids.set(order_id);
}
#[allow(dead_code)]
pub(crate) fn current_order_id(&self) -> i32 {
self.order_ids.current()
}
#[allow(dead_code)]
pub(crate) fn current_request_id(&self) -> i32 {
self.request_ids.current()
}
}
#[cfg(test)]
#[path = "id_generator_tests.rs"]
mod tests;