use std::any::Any;
use std::num::NonZeroU64;
use std::sync::atomic::{AtomicU64, Ordering};
#[cfg(any(target_os = "macos", target_os = "linux"))]
pub fn strip_access_key(raw_menu_text: &str) -> String {
let mut saw_ampersand = false;
let mut result = String::new();
for c in raw_menu_text.chars() {
if c == '&' {
if saw_ampersand {
result.push(c);
}
saw_ampersand = !saw_ampersand;
} else {
result.push(c);
saw_ampersand = false;
}
}
result
}
pub(crate) trait IdleCallback: Send {
fn call(self: Box<Self>, a: &dyn Any);
}
impl<F: FnOnce(&dyn Any) + Send> IdleCallback for F {
fn call(self: Box<F>, a: &dyn Any) {
(*self)(a)
}
}
pub struct Counter(AtomicU64);
impl Counter {
pub const fn new() -> Counter {
Counter(AtomicU64::new(1))
}
pub const unsafe fn new_unchecked(init: u64) -> Counter {
Counter(AtomicU64::new(init))
}
pub fn next(&self) -> u64 {
self.0.fetch_add(1, Ordering::Relaxed)
}
pub fn next_nonzero(&self) -> NonZeroU64 {
unsafe { NonZeroU64::new_unchecked(self.0.fetch_add(1, Ordering::Relaxed)) }
}
}