#![cfg(feature = "macros")]
#[doc(hidden)]
#[macro_export]
macro_rules! wrapper {
($($(#[$meta:meta])* $S:ident($vis:vis $T:ident) $(where $($rest:tt)*)?;),* $(,)?) => {
$($crate::wrapper! { @impl $(#[$meta])* $S($vis $T) $(where $($rest)*)? };)*
};
(@impl
$(#[$meta:meta])*
$S:ident($vis:vis $T:ident) $(where $($rest:tt)*)?;
) => {
#[derive(Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd, $($derive),*)]
#[cfg_attr(
feature = "serde",
derive(serde::Deserialize, serde::Serialize),
serde(default, transparent),
)]
#[repr(transparent)]
pub struct $S<$T>($vis $T) $(where $($rest)*)?;
impl<$T> $S<$T> {
pub const fn new(value: $T) -> Self {
Self(value)
}
pub const fn get(&self) -> &$T {
&self.0
}
pub const fn get_mut(&mut self) -> &mut $T {
&mut self.0
}
#[inline]
pub fn into_inner(self) -> $T {
self.0
}
#[inline]
pub fn map<R, F>(self, f: F) -> $S<R>
where
F: FnOnce($T) -> R,
{
$S(f(self.0))
}
pub const fn replace(&mut self, value: $T) -> $T {
::core::mem::replace(self.get_mut(), value)
}
#[inline]
pub fn set(&mut self, value: $T) {
*self.get_mut() = value;
}
pub const fn swap(&mut self, other: &mut Self) {
::core::mem::swap(self.get_mut(), other.get_mut());
}
#[inline]
pub fn take(&mut self) -> $T
where
$T: Default,
{
::core::mem::take(self.get_mut())
}
pub fn with<_U>(self, value: _U) -> $S<_U> {
$S::new(value)
}
pub fn view(&self) -> $S<&$T> {
$S::new(self.get())
}
pub fn view_mut(&mut self) -> $S<&mut $T> {
$S::new(self.get_mut())
}
}
impl<$T> AsRef<$T> for $S<$T> {
fn as_ref(&self) -> &$T {
self.get()
}
}
impl<$T> AsMut<$T> for $S<$T> {
fn as_mut(&mut self) -> &mut $T {
self.get_mut()
}
}
impl<$T> ::core::borrow::Borrow<$T> for $S<$T> {
fn borrow(&self) -> &$T {
self.get()
}
}
impl<$T> ::core::borrow::BorrowMut<$T> for $S<$T> {
fn borrow_mut(&mut self) -> &mut $T {
self.get_mut()
}
}
impl<$T> ::core::ops::Deref for $S<$T> {
type Target = $T;
fn deref(&self) -> &Self::Target {
self.get()
}
}
impl<$T> ::core::ops::DerefMut for $S<$T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.get_mut()
}
}
impl<$T> From<$T> for $S<$T> {
fn from(value: $T) -> Self {
Self(value)
}
}
};
}