#![doc = include_str!("../README.md")]
#[derive(Debug)]
pub struct InvariantFailure;
pub trait Newtype: Sized {
type Inner;
#[allow(clippy::missing_errors_doc)]
fn try_from_inner(inner: impl TryInto<Self::Inner>) -> Result<Self, InvariantFailure>;
#[inline]
fn from_inner(t: impl Into<Self::Inner>) -> Self {
Self::try_from_inner(t.into()).unwrap()
}
#[inline]
fn replace_inner(this: &mut Self, new: Self::Inner) -> Self::Inner {
Newtype::into_inner(std::mem::replace(this, Newtype::from_inner(new)))
}
#[inline]
fn take_inner(this: &mut Self) -> Self::Inner
where
Self: Default,
{
Newtype::into_inner(std::mem::take(this))
}
fn into_inner(this: Self) -> Self::Inner;
#[inline]
fn clone_inner(this: &Self) -> Self::Inner
where
Self::Inner: Clone,
{
Newtype::as_inner(this).clone()
}
#[allow(unsafe_code)]
fn as_inner(this: &Self) -> &Self::Inner;
#[allow(unsafe_code)]
fn as_inner_mut(this: &mut Self) -> &mut Self::Inner;
#[inline]
fn invariant(_inner: &Self::Inner) -> bool {
true
}
}
#[doc = include_str!(concat!(env!("OUT_DIR"), "/newtype_macro_syntax.md"))]
#[doc = include_str!(concat!(env!("OUT_DIR"), "/newtype_predef.md"))]
#[doc = include_str!(concat!(env!("OUT_DIR"), "/newtype_macro_fns.md"))]
#[doc = include_str!(concat!(env!("OUT_DIR"), "/newtype_macro_traits.md"))]
#[cfg(all(doc, not(doctest)))]
#[macro_export]
macro_rules! newtype {
(
// newtype with default API
struct $name:ident(
// Wrapped inner type
$inner:ty
// followed by any number of markers
$(,$phantom:ty)*
);
$($cont:tt)*
) => {};
(
struct $name:ident(
$inner:ty
$(,$phantom:ty)*
)
{
invariant ($value:ident) { $validating_code:tt }
impl $Traitname:ident $(+$Traitnames:ident)*;
impl $Trait:ident $custom:block
fn $funcname:ident $(+$funcnames:ident)*;
fn $func:ident($($arg:ident: $type:ty),*) $(-> $result:ty)? $code:block
}
$($cont:tt)*
) => {};
}
#[doc(hidden)]
#[cfg(any(not(doc), doctest))]
#[macro_export]
macro_rules! newtype {
(
$(#[$($attrs:meta)*])*
$pub:vis struct $name:ident
$(<
$($lifetimes:lifetime),* $(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)? $(= $default:ty)?),*
>)?
(
$(#[$($mattrs:meta)*])*
$mpub:vis $inner:ty $(,$phantom:ty)*
)
$($cont:tt)*
) => {
$(#[$($attrs)*])*
$pub struct $name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)? $(= $default)?),*
>)?
(
$(#[$($mattrs)*])*
$mpub $inner
$(,$phantom)*
);
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)? ),*
>)?
$crate::Newtype for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
{
type Inner = $inner;
#[inline]
fn try_from_inner(t: impl TryInto<Self::Inner>) -> Result<Self, $crate::InvariantFailure> {
let t = t.try_into().map_err(|_| $crate::InvariantFailure)?;
if !Self::invariant(&t) {
Err($crate::InvariantFailure)
} else {
Ok(Self(t $(, <$phantom>::default())*))
}
}
#[inline]
fn into_inner(this: Self) -> Self::Inner { this.0 }
#[inline]
fn as_inner(this: &Self) -> &Self::Inner { &this.0 }
#[inline]
fn as_inner_mut(this: &mut Self) -> &mut Self::Inner { &mut this.0 }
$crate::newtype!{
@newtype(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
}
$crate::newtype!{
@impls(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@newtype(
$name:ident
$(<
$($lifetimes:lifetime),* $(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
{ $($impls:tt)* }
$($_:tt)*
) => {
$crate::newtype!{
@newtype_fn(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($impls)*
}
};
(@newtype$($_:tt)*) => {};
(
@newtype_fn(
$name:ident
$(<
$($lifetimes:lifetime),* $(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$(#[$($attrs:meta)*])*
invariant ($ref:ident) $code:block
$($cont:tt)*
) => {
$(#[$($attrs)*])*
fn invariant ($ref: &Self::Inner) -> bool $code
$crate::newtype!{
@newtype_fn(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(@newtype_fn$($_:tt)*) => {};
(
@impls(
$name:ident
$(<
$($lifetimes:lifetime),* $(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
;
$($cont:tt)*
) => {
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
impl Deref + AsRef + Borrow + From; pub fn new; fn inner + into_inner + inner_mut; }
$crate::newtype!{$($cont)*}
};
(
@impls(
$name:ident
$(<
$($lifetimes:lifetime),* $(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
{$($impls:tt)*}
$($cont:tt)*
) => {
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($impls)*
}
$crate::newtype!{$($cont)*}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl $trait:ident $(+$traits:ident)+;
$($cont:tt)*
) => {
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
impl $trait;
$(impl $traits;)+
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl Deref;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::ops::Deref for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
type Target = <Self as $crate::Newtype>::Inner;
#[inline]
fn deref(&self) -> &Self::Target {
<Self as $crate::Newtype>::as_inner(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl DerefMut;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::ops::DerefMut for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
<Self as $crate::Newtype>::as_inner_mut(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl AsRef;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::convert::AsRef<<Self as $crate::Newtype>::Inner> for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
fn as_ref(&self) -> &<Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::as_inner(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl AsMut;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::convert::AsMut<<Self as $crate::Newtype>::Inner> for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
fn as_mut(&mut self) -> &mut <Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::as_inner_mut(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl Borrow;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::borrow::Borrow<<Self as $crate::Newtype>::Inner> for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
fn borrow(&self) -> &<Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::as_inner(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl BorrowMut;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::borrow::BorrowMut<<Self as $crate::Newtype>::Inner> for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
fn borrow_mut(&mut self) -> &mut <Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::as_inner_mut(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl TryFrom;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::convert::TryFrom<<Self as $crate::Newtype>::Inner> for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype,
{
type Error=$crate::InvariantFailure;
#[inline]
fn try_from(value: <Self as $crate::Newtype>::Inner) -> Result<Self, Self::Error> {
<Self as $crate::Newtype>::try_from_inner(value)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl From;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::convert::From<<Self as $crate::Newtype>::Inner> for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
fn from(value: <Self as $crate::Newtype>::Inner) -> Self {
<Self as $crate::Newtype>::from_inner(value)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl Default $code:block
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
std::default::Default for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
fn default() -> Self {
<Self as Newtype>::from_inner($code)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
impl
$(<
$($newlifetimes:lifetime),*$(,)?
$($newgeneric:ident$(: $newfirst:tt $(:: $newprest:ident)* $(+ $newmore:tt $(:: $newpmrest:ident)*)*)?),*
>)?
$trait:ty {$($methods:tt)*}
$($cont:tt)*
) => {
impl
$(<
$($newlifetimes,)*
$($lifetimes,)*
$($newgeneric$(: $newfirst $(:: $newprest)* $(+ $newmore $(:: $newpmrest)*)*)?,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$trait for $name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
$($methods)*
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$_fn:ident($_ref:ident) $_code:block
$($cont:tt)*
) => {
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(@impl($($_:tt)*)) => {};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn $func:ident $(+ $funcs:ident)+;
$($cont:tt)*
) => {
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$pub fn $func;
$($pub fn $funcs;)+
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn new;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
$pub fn new(inner: impl Into<<Self as $crate::Newtype>::Inner>) -> Self {
<Self as $crate::Newtype>::from_inner(inner)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn try_new;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
$pub fn try_new(inner: <Self as $crate::Newtype>::Inner) -> Result<Self, InvariantFailure> {
<Self as $crate::Newtype>::try_from_inner(inner)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn into_inner;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
$pub fn into_inner(self) -> <Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::into_inner(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn take;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype + Default
{
#[inline]
$pub fn take(&mut self) -> <Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::take_inner(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn replace;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
$pub fn replace(&mut self, new: <Self as $crate::Newtype>::Inner) -> <Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::replace_inner(self, new)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn inner;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
$pub fn clone_inner(&self) -> <Self as $crate::Newtype>::Inner where <Self as $crate::Newtype>::Inner: Clone {
<Self as $crate::Newtype>::as_inner(self).clone()
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn inner;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
$pub fn clone_inner(&self) -> <Self as $crate::Newtype>::Inner where <Self as $crate::Newtype>::Inner: Clone {
<Self as $crate::Newtype>::as_inner(self).clone()
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$pub:vis fn inner_mut;
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
#[inline]
$pub fn inner_mut(&mut self) -> &mut <Self as $crate::Newtype>::Inner {
<Self as $crate::Newtype>::as_inner_mut(self)
}
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$(#[$($attrs:meta)*])*
$pub:vis fn $fnname:ident($($args:tt)*) $(-> $result:ty)? $code:block
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
$(#[$($attrs)*])*
$pub fn $fnname($($args)*) $(-> $result)? $code
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
(
@impl(
$name:ident
$(<
$($lifetimes:lifetime),*$(,)?
$($generic:ident$(: $first:tt $(:: $prest:ident)* $(+ $more:tt $(:: $pmrest:ident)*)*)?$(= $default:ty)?),*
>)?
)
$(#[$($attrs:meta)*])*
$pub:vis const fn $fnname:ident($($args:tt)*) $(-> $result:ty)? $code:block
$($cont:tt)*
) => {
impl
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?),*
>)?
$name
$(<
$($lifetimes,)*
$($generic),*
>)?
where Self: $crate::Newtype
{
$(#[$($attrs)*])*
$pub const fn $fnname($($args)*) $(-> $result)? $code
}
$crate::newtype!{
@impl(
$name
$(<
$($lifetimes,)*
$($generic$(: $first $(:: $prest)* $(+ $more $(:: $pmrest)*)*)?$(= $default)?),*
>)?
)
$($cont)*
}
};
() => {};
}