#![no_std]
use core::fmt;
use core::sync::atomic::{AtomicBool, Ordering};
#[derive(Default, Debug)]
pub struct CallOnce {
called: AtomicBool,
}
impl CallOnce {
#[inline]
pub const fn new() -> Self {
Self {
called: AtomicBool::new(false),
}
}
#[inline]
pub fn call_once(&self) -> Result<(), CallOnceError> {
self.called
.compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed)
.map(drop)
.map_err(|_| CallOnceError)
}
#[inline]
pub fn was_called(&self) -> bool {
self.called.load(Ordering::Relaxed)
}
}
#[derive(Debug)]
pub struct CallOnceError;
impl fmt::Display for CallOnceError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("call_once was executed more than once")
}
}