00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_CORE_TRAIT_OP_MULT_HH
00027 # define MLN_CORE_TRAIT_OP_MULT_HH
00028
00037 # define mln_op_mult(T, U) typename mln::trait::op_mult< T , U >::ret
00038
00039
00040
00041 namespace mln
00042 {
00043
00044 namespace algebra
00045 {
00046
00047 template <unsigned n, typename T>
00048 class vec;
00049
00050 template <unsigned n, unsigned m, typename T>
00051 class mat;
00052
00053 }
00054
00055 namespace trait
00056 {
00057
00058 template <typename T, typename U>
00059 struct op_mult;
00060
00061
00062 template <typename T>
00063 struct op_mult<T, T>
00064 {
00065 typedef T ret;
00066 };
00067
00068 template <>
00069 struct op_mult<int, float>
00070 {
00071 typedef float ret;
00072 };
00073 template <>
00074 struct op_mult<float, int>
00075 {
00076 typedef float ret;
00077 };
00078
00079 template <>
00080 struct op_mult<int, double>
00081 {
00082 typedef double ret;
00083 };
00084 template <>
00085 struct op_mult<double, int>
00086 {
00087 typedef double ret;
00088 };
00089
00090 template <>
00091 struct op_mult<double, float>
00092 {
00093 typedef double ret;
00094 };
00095 template <>
00096 struct op_mult<float, double>
00097 {
00098 typedef double ret;
00099 };
00100
00101 template <unsigned n, typename T, typename U>
00102 struct op_mult<algebra::vec<n, T>, U>
00103 {
00104 typedef algebra::vec<n, mln_op_mult(T, U)> ret;
00105 };
00106 template <typename U, unsigned n, typename T>
00107 struct op_mult<U, algebra::vec<n, T> >
00108 {
00109 typedef algebra::vec<n, mln_op_mult(T, U)> ret;
00110 };
00111
00112 template <unsigned n, unsigned m, typename T, typename U>
00113 struct op_mult<algebra::mat<n, m, T>, U>
00114 {
00115 typedef algebra::mat<n, m, mln_op_mult(T, U)> ret;
00116 };
00117 template <typename U, unsigned n, unsigned m, typename T>
00118 struct op_mult<U, algebra::mat<n, m, T> >
00119 {
00120 typedef algebra::mat<n, m, mln_op_mult(T, U)> ret;
00121 };
00122
00123 template <unsigned n, unsigned o, typename T, unsigned m, typename U>
00124 struct op_mult<algebra::mat<n, o, T>, algebra::mat<o, m, U> >
00125 {
00126 typedef algebra::mat<n, m, mln_op_mult(T, U)> ret;
00127 };
00128
00129 template <unsigned m, unsigned n, typename T, typename U>
00130 struct op_mult<algebra::mat<m, n, T>, algebra::vec<n, U> >
00131 {
00132 typedef algebra::mat<m, 1, mln_op_mult(T, U)> ret;
00133 };
00134
00135 template <unsigned n, typename U, unsigned m, typename T>
00136 struct op_mult< algebra::vec<n, U>, algebra::mat<n, m, T> >
00137 {
00138 typedef algebra::mat<1, m, mln_op_mult(T, U)> ret;
00139 };
00140
00141
00142 }
00143
00144 }
00145
00146 #endif // ! MLN_CORE_TRAIT_OP_MULT_HH