macro_rules! render_elements {
($(#[$attr:meta])* $vis:vis $name:ident<=$lt:lifetime, $renderer:ty, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<=$lt:lifetime, $renderer:ty, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<=$lt:lifetime, $renderer:ty>; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<=$renderer:ty, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<=$renderer:ty, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<=$renderer:ty>; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<$lt:lifetime, $renderer:ident, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<$lt:lifetime, $renderer:ident, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<$lt:lifetime, $renderer:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<$renderer:ident, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<$renderer:ident, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident<$renderer:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
($(#[$attr:meta])* $vis:vis $name:ident; $($tail:tt)*) => { ... };
}Expand description
Aggregate multiple types implementing RenderElement into a single enum type
use smithay::backend::renderer::element::render_elements;
render_elements! {
MyRenderElements;
First=MyRenderElement1,
Second=MyRenderElement2,
}If the RenderElement has special requirements on the Renderer you can
express them with a syntax similar to HRTBs.
For example the MemoryRenderBufferRenderElement requires
the Renderer to implement the ImportMem trait.
use smithay::backend::renderer::{
element::{memory::MemoryRenderBufferRenderElement, render_elements},
ImportMem,
};
render_elements! {
MyRenderElements<R> where R: ImportMem;
Memory=MemoryRenderBufferRenderElement<R>,
}In case you want to use a reference or an element with an explicit lifetime the macro additionally takes a lifetime on the defined enum.
use smithay::backend::renderer::{
element::{memory::MemoryRenderBufferRenderElement, render_elements},
ImportMem,
};
render_elements! {
MyRenderElements<'a, R> where R: ImportMem;
Memory=&'a MemoryRenderBufferRenderElement<R>,
}Additionally the macro can be used to define generic enums
use smithay::backend::renderer::{
element::{memory::MemoryRenderBufferRenderElement, render_elements},
ImportMem,
};
render_elements! {
MyRenderElements<'a, R, A, B> where R: ImportMem;
Memory=&'a MemoryRenderBufferRenderElement<R>,
Owned=A,
Borrowed=&'a B,
}If your elements require a specific Renderer instead of being
generic over it you can specify the type like in the following example.
use smithay::backend::renderer::element::{render_elements, texture::TextureRenderElement};
render_elements! {
MyRenderElements<=GlesRenderer>;
Texture=TextureRenderElement<GlesTexture>,
}