From 29a99cea512c85d80e6ca0532df1036df4df6665 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 9 Jul 2013 21:17:04 +1000 Subject: [PATCH] Reduce transmute ugliness --- src/color/hsva.rs | 37 ++++++++++++++++++++++++------------- src/color/rgba.rs | 36 ++++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/color/hsva.rs b/src/color/hsva.rs index 17441f6..c0eb46b 100644 --- a/src/color/hsva.rs +++ b/src/color/hsva.rs @@ -17,7 +17,7 @@ use std::cast; use color::{Channel, ToChannel}; use color::{FloatChannel, ToFloatChannel}; -use color::{HSV, ToHSV, RGB, ToRGB, RGBA, ToRGBA}; +use color::{HSV, ToHSV, ToRGB, RGBA, ToRGBA}; #[path = "../num_macros.rs"] mod num_macros; @@ -30,6 +30,21 @@ impl HSVA { pub fn new(h: T, s: T, v: T, a: T) -> HSVA { HSVA { h: h, s: s, v: v, a: a } } + + #[inline] + pub fn from_hsv_a(hsv: HSV, a: T) -> HSVA { + unsafe { cast::transmute((hsv, a)) } + } + + #[inline] + pub fn hsv<'a>(&'a self) -> &'a HSV { + unsafe { cast::transmute(self) } + } + + #[inline] + pub fn hsv_mut<'a>(&'a mut self) -> &'a mut HSV { + unsafe { cast::transmute(self) } + } } pub trait ToHSVA { @@ -40,9 +55,10 @@ impl ToHSVA for (C, T) { #[inline] pub fn to_hsva(&self) -> HSVA { match *self { - (ref c, ref a) => unsafe { - cast::transmute::<(HSV, U), HSVA>( - (c.to_hsv::(), FloatChannel::from(a.clone())) + (ref hsv, ref a) => { + HSVA::from_hsv_a( + hsv.to_hsv(), + FloatChannel::from(a.clone()) ) } } @@ -52,14 +68,9 @@ impl ToHSVA for (C, T) { impl ToRGBA for HSVA { #[inline] pub fn to_rgba(&self) -> RGBA { - match unsafe { - cast::transmute::<&HSVA, &(HSV, T)>(self) - } { - &(ref c, ref a) => unsafe { - cast::transmute::<(RGB, U), RGBA>( - (c.to_rgb::(), Channel::from(a.clone())) - ) - }, - } + RGBA::from_rgb_a( + self.hsv().to_rgb(), + Channel::from((*self).a.clone()) + ) } } diff --git a/src/color/rgba.rs b/src/color/rgba.rs index 00ce1a0..3450ff9 100644 --- a/src/color/rgba.rs +++ b/src/color/rgba.rs @@ -16,7 +16,7 @@ use std::cast; use color::{Channel, ToChannel, FloatChannel}; -use color::{RGB, ToRGB, HSV, ToHSV, HSVA, ToHSVA}; +use color::{RGB, ToRGB, ToHSV, HSVA, ToHSVA}; #[path = "../num_macros.rs"] mod num_macros; @@ -29,6 +29,21 @@ impl RGBA { pub fn new(r: T, g: T, b: T, a: T) -> RGBA { RGBA { r: r, g: g, b: b, a: a } } + + #[inline] + pub fn from_rgb_a(rgb: RGB, a: T) -> RGBA { + unsafe { cast::transmute((rgb, a)) } + } + + #[inline] + pub fn rgb<'a>(&'a self) -> &'a RGB { + unsafe { cast::transmute(self) } + } + + #[inline] + pub fn rgb_mut<'a>(&'a mut self) -> &'a mut RGB { + unsafe { cast::transmute(self) } + } } pub trait ToRGBA { @@ -39,10 +54,8 @@ impl ToRGBA for (C, T) { #[inline] pub fn to_rgba(&self) -> RGBA { match *self { - (ref c, ref a) => unsafe { - cast::transmute::<(RGB, U), RGBA>( - (c.to_rgb::(), Channel::from(a.clone())) - ) + (ref rgb, ref a) => { + RGBA::from_rgb_a(rgb.to_rgb(), Channel::from(a.clone())) } } } @@ -51,14 +64,9 @@ impl ToRGBA for (C, T) { impl ToHSVA for RGBA { #[inline] pub fn to_hsva(&self) -> HSVA { - match unsafe { - cast::transmute::<&RGBA, &(RGB, T)>(self) - } { - &(ref c, ref a) => unsafe { - cast::transmute::<(HSV, U), HSVA>( - (c.to_hsv::(), FloatChannel::from(a.clone())) - ) - } - } + HSVA::from_hsv_a( + self.rgb().to_hsv(), + Channel::from((*self).a.clone()) + ) } }