88c8ad0c823f4ff21654367b06bc6e3fea44d236
[scilab.git] / scilab / modules / ast / includes / operations / types_subtraction.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
4 *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
5 *
6 *  This file must be used under the terms of the CeCILL.
7 *  This source file is licensed as described in the file COPYING, which
8 *  you should have received as part of this distribution.  The terms
9 *  are also available at
10 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 *
12 */
13
14 #ifndef __TYPES_SUB_H__
15 #define __TYPES_SUB_H__
16
17 #include "generic_operations.hxx"
18 #include "double.hxx"
19 #include "polynom.hxx"
20 #include "sparse.hxx"
21
22 void fillSubtractFunction();
23
24 //define arrays on operation functions
25 typedef types::InternalType*(*sub_function)(types::InternalType*, types::InternalType*);
26
27 #define DECLARE_SUB_PROTO(x) template<class T, class U, class O> inline types::InternalType* x(T *_pL, U *_pR)
28 //Double, int , bool
29 DECLARE_SUB_PROTO(sub_M_M);
30 DECLARE_SUB_PROTO(sub_M_MC);
31 DECLARE_SUB_PROTO(sub_M_S);
32 DECLARE_SUB_PROTO(sub_M_SC);
33 DECLARE_SUB_PROTO(sub_M_E);
34
35 DECLARE_SUB_PROTO(sub_MC_M);
36 DECLARE_SUB_PROTO(sub_MC_MC);
37 DECLARE_SUB_PROTO(sub_MC_S);
38 DECLARE_SUB_PROTO(sub_MC_SC);
39 DECLARE_SUB_PROTO(sub_MC_E);
40
41 DECLARE_SUB_PROTO(sub_S_M);
42 DECLARE_SUB_PROTO(sub_S_MC);
43 DECLARE_SUB_PROTO(sub_S_S);
44 DECLARE_SUB_PROTO(sub_S_SC);
45 DECLARE_SUB_PROTO(sub_S_E);
46
47 DECLARE_SUB_PROTO(sub_SC_M);
48 DECLARE_SUB_PROTO(sub_SC_MC);
49 DECLARE_SUB_PROTO(sub_SC_S);
50 DECLARE_SUB_PROTO(sub_SC_SC);
51 DECLARE_SUB_PROTO(sub_SC_E);
52
53 //[]
54 DECLARE_SUB_PROTO(sub_E_M);
55 DECLARE_SUB_PROTO(sub_E_MC);
56 DECLARE_SUB_PROTO(sub_E_E);
57
58 //eye
59 DECLARE_SUB_PROTO(sub_I_M);
60 DECLARE_SUB_PROTO(sub_I_MC);
61 DECLARE_SUB_PROTO(sub_IC_M);
62 DECLARE_SUB_PROTO(sub_IC_MC);
63
64 DECLARE_SUB_PROTO(sub_I_S);
65 DECLARE_SUB_PROTO(sub_I_SC);
66 DECLARE_SUB_PROTO(sub_IC_S);
67 DECLARE_SUB_PROTO(sub_IC_SC);
68
69 DECLARE_SUB_PROTO(sub_M_I);
70 DECLARE_SUB_PROTO(sub_MC_I);
71 DECLARE_SUB_PROTO(sub_M_IC);
72 DECLARE_SUB_PROTO(sub_MC_IC);
73
74 DECLARE_SUB_PROTO(sub_S_I);
75 DECLARE_SUB_PROTO(sub_SC_I);
76 DECLARE_SUB_PROTO(sub_S_IC);
77 DECLARE_SUB_PROTO(sub_SC_IC);
78
79 DECLARE_SUB_PROTO(sub_I_I);
80 DECLARE_SUB_PROTO(sub_I_IC);
81 DECLARE_SUB_PROTO(sub_IC_I);
82 DECLARE_SUB_PROTO(sub_IC_IC);
83
84 DECLARE_SUB_PROTO(sub_I_E);
85 DECLARE_SUB_PROTO(sub_IC_E);
86 DECLARE_SUB_PROTO(sub_E_I);
87 DECLARE_SUB_PROTO(sub_E_IC);
88
89 template<> inline types::InternalType* sub_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
90 template<> inline types::InternalType* sub_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
91 template<> inline types::InternalType* sub_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
92 template<> inline types::InternalType* sub_I_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
93 template<> inline types::InternalType* sub_IC_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
94 template<> inline types::InternalType* sub_I_MC<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
95 template<> inline types::InternalType* sub_IC_MC<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
96
97 template<> inline types::InternalType* sub_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
98 template<> inline types::InternalType* sub_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
99 template<> inline types::InternalType* sub_M_M<types::Sparse, types::Double, types::Double>(types::Sparse* _pL, types::Double* _pR);
100 template<> inline types::InternalType* sub_M_M<types::Double, types::Sparse, types::Sparse>(types::Double* _pL, types::Sparse* _pR);
101 template<> inline types::InternalType* sub_M_M<types::Sparse, types::Double, types::Sparse>(types::Sparse* _pL, types::Double* _pR);
102
103 //add matrix - matrix ( double, int, bool )
104 //same type
105 template<typename T, typename O> inline static void sub(T* l, size_t size, T* r, O* o)
106 {
107     for (size_t i = 0; i < size ; ++i)
108     {
109         o[i] = (O)l[i] - (O)r[i];
110     }
111 }
112
113 //x - x
114 template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U* r, O* o)
115 {
116     for (size_t i = 0; i < size ; ++i)
117     {
118         o[i] = (O)l[i] - (O)r[i];
119     }
120 }
121
122
123 //x - xC
124 template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U* r, U* rc, O* o, O* oc)
125 {
126     for (size_t i = 0; i < size ; ++i)
127     {
128         o[i] = (O)l[i] - (O)r[i];
129         oc[i] = (O) - rc[i];
130     }
131 }
132
133 //xC - x
134 template<typename T, typename U, typename O> inline static void sub(T* l, T* lc, size_t size, U* r, O* o, O* oc)
135 {
136     for (size_t i = 0; i < size ; ++i)
137     {
138         o[i] = (O)l[i] - (O)r[i];
139         oc[i] = (O)lc[i];
140     }
141 }
142
143 // xC - xC
144 template<typename T, typename O> inline static void sub(T* l, T* lc, size_t size, T* r, T* rc, O* o, O* oc)
145 {
146     for (size_t i = 0; i < size ; ++i)
147     {
148         o[i] = (O)l[i] - (O)r[i];
149         oc[i] = (O)lc[i] - (O)rc[i];
150     }
151 }
152
153 //add matrix - scalar ( double, int, bool )
154 //x - x1
155 template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U r, O* o)
156 {
157     for (size_t i = 0; i < size ; ++i)
158     {
159         o[i] = (O)l[i] - (O)r;
160     }
161 }
162
163 //xC - x1
164 template<typename T, typename U, typename O> inline static void sub(T* l, T* lc, size_t size, U r, O* o, O* oc)
165 {
166     for (size_t i = 0; i < size ; ++i)
167     {
168         o[i] = (O)l[i] - (O)r;
169         oc[i] = (O)lc[i];
170     }
171 }
172
173 //x - x1C
174 template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U r, U rc, O* o, O* oc)
175 {
176     for (size_t i = 0; i < size ; ++i)
177     {
178         o[i] = (O)l[i] - (O) r;
179         oc[i] = (O) - rc;
180     }
181 }
182
183 //xC - x1C
184 template<typename T, typename O> inline static void sub(T* l, T* lc, size_t size, T r, T rc, O* o, O* oc)
185 {
186     for (size_t i = 0; i < size ; ++i)
187     {
188         o[i] = (O)l[i] - (O)r;
189         oc[i] = (O)lc[i] - (O)rc;
190     }
191 }
192
193 //add scalar - matrix ( double, int, bool )
194 //x1 - x
195 template<typename T, typename U, typename O> inline static void sub(T l, size_t size, U* r, O* o)
196 {
197     for (size_t i = 0; i < size ; ++i)
198     {
199         o[i] = (O)l - (O)r[i];
200     }
201 }
202
203 //x1 - xC
204 template<typename T, typename U, typename O> inline static void sub(T l, size_t size, U* r, U* rc, O* o, O* oc)
205 {
206     for (size_t i = 0; i < size ; ++i)
207     {
208         o[i] = (O)l - (O)r[i];
209         oc[i] = (O) - rc[i];
210     }
211 }
212
213 //x1C - x
214 template<typename T, typename U, typename O> inline static void sub(T l, T lc, size_t size, U* r, O* o, O* oc)
215 {
216     for (size_t i = 0; i < size ; ++i)
217     {
218         o[i] = (O)l - (O)r[i];
219         oc[i] = (O)lc;
220     }
221 }
222
223 //x1C - xC
224 template<typename T, typename O> inline static void sub(T l, T lc, size_t size, T* r, T* rc, O* o, O* oc)
225 {
226     for (size_t i = 0; i < size ; ++i)
227     {
228         o[i] = (O)l - (O)r[i];
229         oc[i] = (O)lc - rc[i];
230     }
231 }
232
233
234 //add scalar - scalar ( double, int, bool )
235 //same type
236 template<typename T, typename O> inline static void sub(T l, T r, O* o)
237 {
238     *o = (O)l - (O)r;
239 }
240 //x1 - x1
241 template<typename T, typename U, typename O> inline static void sub(T l, U r, O* o)
242 {
243     *o = (O)l - (O)r;
244 }
245
246 //x1C - x1C
247 template<typename T, typename U, typename O> inline static void sub(T l, T lc, U r, U rc, O* o, O* oc)
248 {
249     *o = (O)l - (O)r;
250     *oc = (O)lc - (O)rc;
251 }
252
253 //x1 - []
254 template<typename T, typename O> inline static void sub(T l, O* o)
255 {
256     *o = (O)l;
257 }
258
259 //x1c - []
260 template<typename T, typename O> inline static void sub(T l, T lc, O* o, O* oc)
261 {
262     *o = (O)l;
263     *oc = (O)lc;
264 }
265
266 //[] - []
267 inline static void sub()
268 {
269 }
270
271 #endif /* __TYPES_SUB_H__ */