$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
op_mult.hh
1 // Copyright (C) 2006, 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
2 //
3 // This file is part of Olena.
4 //
5 // Olena is free software: you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free
7 // Software Foundation, version 2 of the License.
8 //
9 // Olena is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Olena. If not, see <http://www.gnu.org/licenses/>.
16 //
17 // As a special exception, you may use this file as part of a free
18 // software project without restriction. Specifically, if other files
19 // instantiate templates or use macros or inline functions from this
20 // file, or you compile this file and link it with other files to produce
21 // an executable, this file does not by itself cause the resulting
22 // executable to be covered by the GNU General Public License. This
23 // exception does not however invalidate any other reasons why the
24 // executable file might be covered by the GNU General Public License.
25 
26 #ifndef MLN_CORE_TRAIT_OP_MULT_HH
27 # define MLN_CORE_TRAIT_OP_MULT_HH
28 
37 # define mln_op_mult(T, U) typename mln::trait::op_mult< T , U >::ret
38 
39 
40 
41 namespace mln
42 {
43 
44  namespace algebra
45  {
46 
47  template <unsigned n, typename T>
48  class vec;
49 
50  template <unsigned n, unsigned m, typename T>
51  class mat;
52 
53  } // end of namespace mln::metal
54 
55  namespace trait
56  {
57 
58  template <typename T, typename U>
59  struct op_mult;
60 
61 
62  template <typename T>
63  struct op_mult<T, T>
64  {
65  typedef T ret;
66  };
67 
68  template <>
69  struct op_mult<int, float>
70  {
71  typedef float ret;
72  };
73  template <>
74  struct op_mult<float, int>
75  {
76  typedef float ret;
77  };
78 
79  template <>
80  struct op_mult<int, double>
81  {
82  typedef double ret;
83  };
84  template <>
85  struct op_mult<double, int>
86  {
87  typedef double ret;
88  };
89 
90  template <>
91  struct op_mult<double, float>
92  {
93  typedef double ret;
94  };
95  template <>
96  struct op_mult<float, double>
97  {
98  typedef double ret;
99  };
100 
101  template <unsigned n, typename T, typename U>
102  struct op_mult<algebra::vec<n, T>, U>
103  {
104  typedef algebra::vec<n, mln_op_mult(T, U)> ret;
105  };
106  template <typename U, unsigned n, typename T>
107  struct op_mult<U, algebra::vec<n, T> >
108  {
109  typedef algebra::vec<n, mln_op_mult(T, U)> ret;
110  };
111 
112  template <unsigned n, unsigned m, typename T, typename U>
113  struct op_mult<algebra::mat<n, m, T>, U>
114  {
115  typedef algebra::mat<n, m, mln_op_mult(T, U)> ret;
116  };
117  template <typename U, unsigned n, unsigned m, typename T>
118  struct op_mult<U, algebra::mat<n, m, T> >
119  {
120  typedef algebra::mat<n, m, mln_op_mult(T, U)> ret;
121  };
122 
123  template <unsigned n, unsigned o, typename T, unsigned m, typename U>
124  struct op_mult<algebra::mat<n, o, T>, algebra::mat<o, m, U> >
125  {
126  typedef algebra::mat<n, m, mln_op_mult(T, U)> ret;
127  };
128 
129  template <unsigned m, unsigned n, typename T, typename U>
130  struct op_mult<algebra::mat<m, n, T>, algebra::vec<n, U> >
131  {
132  typedef algebra::mat<m, 1, mln_op_mult(T, U)> ret;
133  };
134 
135  template <unsigned n, typename U, unsigned m, typename T>
136  struct op_mult< algebra::vec<n, U>, algebra::mat<n, m, T> >
137  {
138  typedef algebra::mat<1, m, mln_op_mult(T, U)> ret;
139  };
140 
141 
142  } // end of namespace mln::trait
143 
144 } // end of namespace mln
145 
146 #endif // ! MLN_CORE_TRAIT_OP_MULT_HH