マクロルール(macro_rule!)を使って型の定義
image-rsから
macro_rules! define_colors { {$( $ident:ident, $channels: expr, $alphas: expr, $interpretation: expr, $color_type_u8: expr, $color_type_u16: expr, #[$doc:meta]; )*} => { $( // START Structure definitions #[$doc] #[derive(PartialEq, Eq, Clone, Debug, Copy, Hash)] #[repr(C)] #[allow(missing_docs)] pub struct $ident<T: Primitive> (pub [T; $channels]); impl<T: Primitive + 'static> Pixel for $ident<T> { type Subpixel = T; const CHANNEL_COUNT: u8 = $channels; const COLOR_MODEL: &'static str = $interpretation; const COLOR_TYPE: ColorType = [$color_type_u8, $color_type_u16][(std::mem::size_of::<T>() > 1) as usize]; #[inline(always)] fn channels(&self) -> &[T] { &self.0 } #[inline(always)] fn channels_mut(&mut self) -> &mut [T] { &mut self.0 } fn channels4(&self) -> (T, T, T, T) { const CHANNELS: usize = $channels; let mut channels = [T::max_value(); 4]; channels[0..CHANNELS].copy_from_slice(&self.0); (channels[0], channels[1], channels[2], channels[3]) } fn from_channels(a: T, b: T, c: T, d: T,) -> $ident<T> { const CHANNELS: usize = $channels; *<$ident<T> as Pixel>::from_slice(&[a, b, c, d][..CHANNELS]) } .... impl<T: Primitive + 'static> From<[T; $channels]> for $ident<T> { fn from(c: [T; $channels]) -> Self { Self(c) } } )* // END Structure definitions } } define_colors! { Rgb, 3, 0, "RGB", ColorType::Rgb8, ColorType::Rgb16, #[doc = "RGB colors"]; Bgr, 3, 0, "BGR", ColorType::Bgr8, ColorType::Bgr8, #[doc = "BGR colors"]; Luma, 1, 0, "Y", ColorType::L8, ColorType::L16, #[doc = "Grayscale colors"]; Rgba, 4, 1, "RGBA", ColorType::Rgba8, ColorType::Rgba16, #[doc = "RGB colors + alpha channel"]; Bgra, 4, 1, "BGRA", ColorType::Bgra8, ColorType::Bgra8, #[doc = "BGR colors + alpha channel"]; LumaA, 2, 1, "YA", ColorType::La8, ColorType::La16, #[doc = "Grayscale colors + alpha channel"]; }