use std::collections::HashMap;
use std::hash::Hash;
use std::mem;
macro_rules! debug_panic {
() => { ... };
($msg:expr) => {
if cfg!(debug_assertions) {
panic!($msg);
} else {
tracing::error!($msg);
}
};
($msg:expr,) => { debug_panic!($msg) };
($fmt:expr, $($arg:tt)+) => {
if cfg!(debug_assertions) {
panic!($fmt, $($arg)*);
} else {
tracing::error!($fmt, $($arg)*);
}
};
}
pub trait ExtendDrain {
fn extend_drain(&mut self, source: &mut Self);
}
impl<K, V> ExtendDrain for HashMap<K, V>
where
K: Eq + Hash + Copy,
V: Copy,
{
fn extend_drain(&mut self, source: &mut Self) {
if !source.is_empty() {
if self.is_empty() {
mem::swap(self, source);
} else {
self.extend(source.drain());
}
}
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum Handled {
Yes,
No,
}
impl Handled {
pub fn is_handled(self) -> bool {
self == Handled::Yes
}
}
impl From<bool> for Handled {
fn from(handled: bool) -> Handled {
if handled {
Handled::Yes
} else {
Handled::No
}
}
}