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