#[cfg(feature = "parking_lot")]
pub mod sync {
pub use parking_lot::{Mutex, MutexGuard};
}
#[cfg(all(feature = "std", not(feature = "parking_lot")))]
pub mod sync {
pub use std::sync::MutexGuard;
use std::sync::PoisonError;
pub struct Mutex<T>(pub std::sync::Mutex<T>);
impl<T> Mutex<T> {
pub const fn new(value: T) -> Self {
Mutex(std::sync::Mutex::new(value))
}
#[inline]
pub fn lock(&self) -> MutexGuard<'_, T> {
self.0.lock().unwrap_or_else(PoisonError::into_inner)
}
}
}
#[cfg_attr(not(feature = "std"), allow(unused_imports))]
pub use self::cell::OnceCell;
#[cfg_attr(not(feature = "std"), allow(dead_code))]
mod cell {
use core::cell::UnsafeCell;
pub struct OnceCell<T> {
value: UnsafeCell<Option<T>>,
}
impl<T> OnceCell<T> {
#[inline]
pub const fn new() -> Self {
OnceCell {
value: UnsafeCell::new(None),
}
}
#[inline]
pub fn get(&self) -> Option<&'_ T> {
unsafe {
let x: &Option<T> = &*self.value.get();
x.as_ref()
}
}
#[inline]
pub fn set(&self, new_value: T) -> Result<(), &'_ T> {
unsafe {
let x: &mut Option<T> = &mut *self.value.get();
match *x {
Some(ref existing) => Err(existing),
None => {
*x = Some(new_value);
Ok(())
}
}
}
}
}
unsafe impl<T> Send for OnceCell<T> {}
}
macro_rules! simple_serde_serialize {
($target:ident, |$this:ident| $to_inner:expr) => {
#[cfg(feature = "serde")]
#[cfg_attr(feature = "nightly-docs", doc(cfg(feature = "serde")))]
impl serde::Serialize for $target {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let $this = self;
let value = $to_inner;
serde::Serialize::serialize(&value, serializer)
}
}
};
}