1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
use super::types::V1; use crate::matrix::{M2, M3, M4}; use crate::numeric::Numeric; use crate::vector::{V2, V3, V4}; pub trait Finalizer<T> { fn finalize(self) -> T; } macro_rules! impl_identity_finalizer { ($tt: tt) => { impl<T> Finalizer<$tt<T>> for $tt<T> { fn finalize(self) -> $tt<T> { self } } }; } impl_identity_finalizer!(V2); impl_identity_finalizer!(V3); impl_identity_finalizer!(V4); impl_identity_finalizer!(M2); impl_identity_finalizer!(M3); impl_identity_finalizer!(M4); impl<T> Finalizer<V2<T>> for V1<T> where T: Numeric, { fn finalize(self) -> V2<T> { V2([*self; 2]) } } impl<T> Finalizer<V3<T>> for V1<T> where T: Numeric, { fn finalize(self) -> V3<T> { V3([*self; 3]) } } impl<T> Finalizer<V4<T>> for V1<T> where T: Numeric, { fn finalize(self) -> V4<T> { V4([*self; 4]) } } impl<T> Finalizer<M2<T>> for V1<T> where T: Numeric, { fn finalize(self) -> M2<T> { M2([[*self; 2], [*self; 2]]) } } impl<T> Finalizer<M3<T>> for V1<T> where T: Numeric, { fn finalize(self) -> M3<T> { M3([[*self; 3], [*self; 3], [*self; 3]]) } } impl<T> Finalizer<M4<T>> for V1<T> where T: Numeric, { fn finalize(self) -> M4<T> { M4([[*self; 4], [*self; 4], [*self; 4], [*self; 4]]) } } impl<T> Finalizer<V2<T>> for V3<T> where T: Numeric, { fn finalize(self) -> V2<T> { let s = &self; V2([s[0], s[1]]) } } impl<T> Finalizer<V2<T>> for V4<T> where T: Numeric, { fn finalize(self) -> V2<T> { let s = &self; V2([s[0], s[1]]) } } impl<T> Finalizer<V3<T>> for V4<T> where T: Numeric, { fn finalize(self) -> V3<T> { let s = &self; V3([s[0], s[1], s[2]]) } }