macro_rules! intrusive_adapter {
(@impl
($($privacy:tt)*) $name:ident ($($args:tt $(: ?$bound:tt)*),*)
= $pointer:ty: $value:path { $field:ident: $link:ty } $($where_:tt)*
) => { ... };
(@find_generic
($($privacy:tt)*) $name:tt ($($prev:tt)*) > $($rest:tt)*
) => { ... };
(@find_generic
($($privacy:tt)*) $name:tt ($($prev:tt)*) $cur:tt $($rest:tt)*
) => { ... };
(@find_if_generic
($($privacy:tt)*) $name:tt < $($rest:tt)*
) => { ... };
(@find_if_generic
($($privacy:tt)*) $name:tt $($rest:tt)*
) => { ... };
(pub $name:tt $($rest:tt)*) => { ... };
($name:tt $($rest:tt)*) => { ... };
}
Expand description
Macro to generate an implementation of Adapter
for a given set of types.
In particular this will automatically generate implementations of the
get_value
and get_link
methods for a given named field in a struct.
The basic syntax to create an adapter is:
ⓘ
intrusive_adapter!(Adapter = Pointer: Value { link_field: LinkType });
Generics
This macro supports generic arguments:
ⓘ
intrusive_adapter!(Adapter<'lifetime, Type, Type2: ?Sized> = Pointer: Value { link_field: LinkType } where Type: Copy, Type2: 'lifetiem);
Note that due to macro parsing limitations, only ?Trait
style bounds are
allowed in the generic argument list. In most cases this is only needed for
?Sized
. Other bounds can be specified in the where
clause at the end
the macro.
Examples
#[macro_use]
extern crate intrusive_collections;
use intrusive_collections::{LinkedListLink, RBTreeLink};
pub struct Test {
link: LinkedListLink,
link2: RBTreeLink,
}
intrusive_adapter!(MyAdapter = Box<Test>: Test { link: LinkedListLink });
intrusive_adapter!(pub MyAdapter2 = Box<Test>: Test { link2: RBTreeLink });
pub struct Test2<T: ?Sized>
where T: Clone
{
link: LinkedListLink,
val: T,
}
intrusive_adapter!(MyAdapter3<'a, T: ?Sized> = &'a Test2<T>: Test2<T> { link: LinkedListLink } where T: Clone + 'a);