// Copyright 2013 The Lmath Developers. For a full listing of the authors, // refer to the AUTHORS file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use core::{Vec2, Vec3, Vec4, Quat}; pub trait Swap { pub fn swap(&mut self, a: uint, b: uint); } macro_rules! impl_swap( ($Self:ident) => ( impl Swap for $Self { #[inline] pub fn swap(&mut self, a: uint, b: uint) { let tmp = self.index(a).clone(); *self.index_mut(a) = self.index(b).clone(); *self.index_mut(b) = tmp; } } ) ) impl_swap!(Vec2) impl_swap!(Vec3) impl_swap!(Vec4) impl_swap!(Quat) // This enclosing module is required because attributes don't play nice // with macros yet #[cfg(geom)] pub mod geom_impls { use super::Swap; use geom::{Point2, Point3}; impl_swap!(Point2) impl_swap!(Point3) } // This enclosing module is required because attributes don't play nice // with macros yet #[cfg(color)] pub mod color_impls { use super::Swap; use color::{HSV, HSVA, YCbCr}; use color::{RGB, RGBA, SRGB, SRGBA}; impl_swap!(HSV) impl_swap!(HSVA) impl_swap!(RGB) impl_swap!(RGBA) impl_swap!(SRGB) impl_swap!(SRGBA) impl_swap!(YCbCr) }