Skip to main content

impl_as_ref

Macro impl_as_ref 

Source
macro_rules! impl_as_ref {
    (<$($generic:ident),+> in $($rest:tt)+) => { ... };
    (<const $($rest:tt)+) => { ... };
    (<$generic:ident, $($rest:tt)+) => { ... };
    (@impl [$($generic:tt)+] $this:ty => $inner:ty) => { ... };
    (@impl [$($generic:tt)+] $this:ty => $field:ident : $inner:ty) => { ... };
    ($this:ident $(<$($generic:ident),+>)? => $inner:ty) => { ... };
    ($this:ident $(<$($generic:ident),+>)? => $field:ident : $inner:ty) => { ... };
}
Expand description

Implement AsRef for a struct.

The first argument is that of the struct to create the impl for and the second is the type to produce a reference for.

Declare type and const parameters before in. The Foo<T> form also accepts type parameters.

ยงExamples

With a newtype struct:

use impl_more::impl_as_ref;

struct Foo(String);
impl_as_ref!(Foo => String);
let foo = Foo("bar".to_owned());
assert_eq!(foo.as_ref(), "bar");

With a named field struct and type parameters:

use impl_more::impl_as_ref;

struct Foo<T> { inner: T }
impl_as_ref!(Foo<T> => inner: T);
let foo = Foo { inner: "bar".to_owned() };
assert_eq!(foo.as_ref().as_str(), "bar");

With type and const parameters:

struct Array<T, const N: usize>([T; N]);
impl_more::impl_as_ref!(<T, const N: usize> in Array<T, N> => [T; N]);
impl_more::impl_as_mut!(<T, const N: usize> in Array<T, N> => [T; N]);

let mut value = Array([1, 2, 3]);
value.as_mut().reverse();
assert_eq!(value.as_ref(), &[3, 2, 1]);