impl RenderOnce on tuples of up to 8 values
This commit is contained in:
parent
2db5b83461
commit
19a740f26c
|
@ -131,10 +131,7 @@ pub trait RenderOnce: Sized {
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
impl<T> RenderOnce for T
|
impl<T: Render> RenderOnce for T {
|
||||||
where
|
|
||||||
T: Render,
|
|
||||||
{
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn render_once(self, b: &mut Buffer) -> Result<(), RenderError> {
|
fn render_once(self, b: &mut Buffer) -> Result<(), RenderError> {
|
||||||
self.render(b)
|
self.render(b)
|
||||||
|
@ -459,6 +456,69 @@ impl<T: Render> Render for Wrapping<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! render_tuple {
|
||||||
|
($A:ident) => {
|
||||||
|
render_tuple!(@ $A);
|
||||||
|
};
|
||||||
|
($A:ident $(, $T:ident)+) => {
|
||||||
|
render_tuple!(@ $A $(, $T)+);
|
||||||
|
render_tuple!($($T),+);
|
||||||
|
};
|
||||||
|
(@ $($T:ident),*) => {
|
||||||
|
impl<$($T: Render),+> Render for ($($T,)+) {
|
||||||
|
#[inline]
|
||||||
|
fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
let ($($T,)+) = self;
|
||||||
|
$($T.render(b)?;)+
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
let ($($T,)+) = self;
|
||||||
|
$($T.render_escaped(b)?;)+
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! render_once_tuple {
|
||||||
|
($A:ident) => {
|
||||||
|
render_once_tuple!(@ $A);
|
||||||
|
};
|
||||||
|
($A:ident $(, $T:ident)+) => {
|
||||||
|
render_once_tuple!(@ $A $(, $T)+);
|
||||||
|
render_once_tuple!($($T),+);
|
||||||
|
};
|
||||||
|
(@ $($T:ident),*) => {
|
||||||
|
impl<$($T: RenderOnce),+> RenderOnce for ($($T,)+) {
|
||||||
|
#[inline]
|
||||||
|
fn render_once(self, b: &mut Buffer) -> Result<(), RenderError> {
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
let ($($T,)+) = self;
|
||||||
|
$($T.render_once(b)?;)+
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn render_once_escaped(self, b: &mut Buffer) -> Result<(), RenderError> {
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
let ($($T,)+) = self;
|
||||||
|
$($T.render_once_escaped(b)?;)+
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: figure out how to use specialization to allow a Render impl on tuples, if possible. If
|
||||||
|
// not, oh well, it can be worked around.
|
||||||
|
// render_tuple!(A, B, C, D, E, F, G, H);
|
||||||
|
render_once_tuple!(A, B, C, D, E, F, G, H);
|
||||||
|
|
||||||
/// The error type which is returned from template function
|
/// The error type which is returned from template function
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum RenderError {
|
pub enum RenderError {
|
||||||
|
|
Loading…
Reference in New Issue