impl_more/as_ref.rs
1/// Implement [`AsRef`] for a struct.
2///
3/// The first argument is that of the struct to create the impl for and the second is the type to
4/// produce a reference for.
5///
6/// # Examples
7/// With a newtype struct:
8/// ```
9/// use impl_more::impl_as_ref;
10///
11/// struct Foo(String);
12/// impl_as_ref!(Foo => String);
13/// let foo = Foo("bar".to_owned());
14/// assert_eq!(foo.as_ref(), "bar");
15/// ```
16///
17/// With a named field struct and type parameters:
18/// ```
19/// use impl_more::impl_as_ref;
20///
21/// struct Foo<T> { inner: T }
22/// impl_as_ref!(Foo<T> => inner: T);
23/// let foo = Foo { inner: "bar".to_owned() };
24/// assert_eq!(foo.as_ref().as_str(), "bar");
25/// ```
26#[macro_export]
27macro_rules! impl_as_ref {
28 ($this:ident $(<$($generic:ident),+>)? => $inner:ty) => {
29 impl $(<$($generic),+>)? ::core::convert::AsRef<$inner> for $this $(<$($generic),+>)? {
30 fn as_ref(&self) -> &$inner {
31 &self.0
32 }
33 }
34 };
35
36 ($this:ident $(<$($generic:ident),+>)? => $field:ident : $inner:ty) => {
37 impl $(<$($generic),+>)? ::core::convert::AsRef<$inner> for $this $(<$($generic),+>)? {
38 fn as_ref(&self) -> &$inner {
39 &self.$field
40 }
41 }
42 };
43}
44
45/// Implement [`AsMut`] for a struct.
46///
47/// The first argument is that of the struct to create the impl for and the second is the type to
48/// produce a reference for.
49///
50/// # Examples
51/// With a newtype struct:
52/// ```
53/// use impl_more::{impl_as_ref, impl_as_mut};
54///
55/// struct Foo(String);
56///
57/// impl_as_ref!(Foo => String);
58/// impl_as_mut!(Foo => String);
59///
60/// let mut foo = Foo("bar".to_owned());
61/// foo.as_mut().push('!');
62///
63/// assert_eq!(foo.as_ref(), "bar!");
64/// ```
65///
66/// With a named field struct and type parameters:
67/// ```
68/// use impl_more::{impl_as_ref, impl_as_mut};
69///
70/// struct Foo<T> { inner: T }
71///
72/// impl_as_ref!(Foo<T> => inner: T);
73/// impl_as_mut!(Foo<T> => inner: T);
74///
75/// let mut foo = Foo { inner: "bar".to_owned() };
76/// foo.as_mut().push('!');
77///
78/// assert_eq!(foo.as_ref(), "bar!");
79/// ```
80#[macro_export]
81macro_rules! impl_as_mut {
82 ($this:ident $(<$($generic:ident),+>)? => $inner:ty) => {
83 impl $(<$($generic),+>)? ::core::convert::AsMut<$inner> for $this $(<$($generic),+>)? {
84 fn as_mut(&mut self) -> &mut $inner {
85 &mut self.0
86 }
87 }
88 };
89
90 ($this:ident $(<$($generic:ident),+>)? => $field:ident : $inner:ty) => {
91 impl $(<$($generic),+>)? ::core::convert::AsMut<$inner> for $this $(<$($generic),+>)? {
92 fn as_mut(&mut self) -> &mut $inner {
93 &mut self.$field
94 }
95 }
96 };
97}