* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / operations / types_addition.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_ADD_H__
18 #define __TYPES_ADD_H__
19
20 #include "generic_operations.hxx"
21 #include "double.hxx"
22 #include "string.hxx"
23 #include "polynom.hxx"
24 #include "sparse.hxx"
25 #include "string.hxx"
26 extern "C"
27 {
28 #include "os_string.h"
29 }
30
31 void fillAddFunction();
32
33 //define arrays on operation functions
34 typedef types::InternalType*(*add_function)(types::InternalType*, types::InternalType*);
35
36 #define DECLARE_ADD_PROTO(x) template<class T, class U, class O> types::InternalType* x(T *_pL, U *_pR)
37 //Double, int , bool
38 DECLARE_ADD_PROTO(add_M_M);
39 DECLARE_ADD_PROTO(add_M_MC);
40 DECLARE_ADD_PROTO(add_M_S);
41 DECLARE_ADD_PROTO(add_M_SC);
42 DECLARE_ADD_PROTO(add_M_E);
43
44 DECLARE_ADD_PROTO(add_MC_M);
45 DECLARE_ADD_PROTO(add_MC_MC);
46 DECLARE_ADD_PROTO(add_MC_S);
47 DECLARE_ADD_PROTO(add_MC_SC);
48 DECLARE_ADD_PROTO(add_MC_E);
49
50 DECLARE_ADD_PROTO(add_S_M);
51 DECLARE_ADD_PROTO(add_S_MC);
52 DECLARE_ADD_PROTO(add_S_S);
53 DECLARE_ADD_PROTO(add_S_SC);
54 DECLARE_ADD_PROTO(add_S_E);
55
56 DECLARE_ADD_PROTO(add_SC_M);
57 DECLARE_ADD_PROTO(add_SC_MC);
58 DECLARE_ADD_PROTO(add_SC_S);
59 DECLARE_ADD_PROTO(add_SC_SC);
60 DECLARE_ADD_PROTO(add_SC_E);
61
62 //[]
63 DECLARE_ADD_PROTO(add_E_M);
64 DECLARE_ADD_PROTO(add_E_MC);
65 DECLARE_ADD_PROTO(add_E_S);
66 DECLARE_ADD_PROTO(add_E_SC);
67 DECLARE_ADD_PROTO(add_E_E);
68
69 //eye
70 DECLARE_ADD_PROTO(add_I_M);
71 DECLARE_ADD_PROTO(add_I_MC);
72 DECLARE_ADD_PROTO(add_IC_M);
73 DECLARE_ADD_PROTO(add_IC_MC);
74
75 DECLARE_ADD_PROTO(add_I_S);
76 DECLARE_ADD_PROTO(add_I_SC);
77 DECLARE_ADD_PROTO(add_IC_S);
78 DECLARE_ADD_PROTO(add_IC_SC);
79
80 DECLARE_ADD_PROTO(add_M_I);
81 DECLARE_ADD_PROTO(add_MC_I);
82 DECLARE_ADD_PROTO(add_M_IC);
83 DECLARE_ADD_PROTO(add_MC_IC);
84
85 DECLARE_ADD_PROTO(add_S_I);
86 DECLARE_ADD_PROTO(add_SC_I);
87 DECLARE_ADD_PROTO(add_S_IC);
88 DECLARE_ADD_PROTO(add_SC_IC);
89
90 DECLARE_ADD_PROTO(add_I_I);
91 DECLARE_ADD_PROTO(add_I_IC);
92 DECLARE_ADD_PROTO(add_IC_I);
93 DECLARE_ADD_PROTO(add_IC_IC);
94
95 DECLARE_ADD_PROTO(add_I_E);
96 DECLARE_ADD_PROTO(add_IC_E);
97 DECLARE_ADD_PROTO(add_E_I);
98 DECLARE_ADD_PROTO(add_E_IC);
99
100 #undef DECLARE_ADD_PROTO
101
102 //String specilization
103
104 template<> types::InternalType* add_M_M<types::String, types::String, types::String>(types::String* _pL, types::String* _pR);
105 template<> types::InternalType* add_S_M<types::String, types::String, types::String>(types::String* _pL, types::String* _pR);
106 template<> types::InternalType* add_M_S<types::String, types::String, types::String>(types::String* _pL, types::String* _pR);
107 template<> types::InternalType* add_S_S<types::String, types::String, types::String>(types::String* _pL, types::String* _pR);
108 template<> types::InternalType* add_M_E<types::String, types::Double, types::String>(types::String* _pL, types::Double* _pR);
109 template<> types::InternalType* add_S_E<types::String, types::Double, types::String>(types::String* _pL, types::Double* _pR);
110 template<> types::InternalType* add_E_M<types::Double, types::String, types::String>(types::Double* _pL, types::String* _pR);
111 template<> types::InternalType* add_E_S<types::Double, types::String, types::String>(types::Double* _pL, types::String* _pR);
112
113 template<> types::InternalType* add_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
114 template<> types::InternalType* add_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
115 template<> types::InternalType* add_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
116 template<> types::InternalType* add_M_I<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
117 template<> types::InternalType* add_I_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
118
119 template<> types::InternalType* add_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
120 template<> types::InternalType* add_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
121 template<> types::InternalType* add_M_M<types::Sparse, types::Double, types::Double>(types::Sparse* _pL, types::Double* _pR);
122 template<> types::InternalType* add_M_M<types::Double, types::Sparse, types::Sparse>(types::Double* _pL, types::Sparse* _pR);
123 template<> types::InternalType* add_M_M<types::Sparse, types::Double, types::Sparse>(types::Sparse* _pL, types::Double* _pR);
124
125 //add matrix + matrix ( double, int, bool )
126 //same type
127 template<typename T, typename O> inline static void add(T* l, size_t size, T* r, O* o)
128 {
129     for (size_t i = 0; i < size ; ++i)
130     {
131         o[i] = (O)l[i] + (O)r[i];
132     }
133 }
134
135 //string version
136 inline static void add(wchar_t** l, size_t size, wchar_t** r, int* length , wchar_t** o)
137 {
138     for (size_t i = 0; i < size ; ++i)
139     {
140         os_swprintf(o[i], length[i], L"%ls%ls", l[i], r[i]);
141     }
142 }
143
144 //x + x
145 template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U* r, O* o)
146 {
147     for (size_t i = 0; i < size ; ++i)
148     {
149         o[i] = (O)l[i] + (O)r[i];
150     }
151 }
152
153
154 //x + xC
155 template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U* r, U* rc, O* o, O* oc)
156 {
157     for (size_t i = 0; i < size ; ++i)
158     {
159         o[i] = (O)l[i] + (O)r[i];
160         oc[i] = (O)rc[i];
161     }
162 }
163
164 //xC + x
165 template<typename T, typename U, typename O> inline static void add(T* l, T* lc, size_t size, U* r, O* o, O* oc)
166 {
167     for (size_t i = 0; i < size ; ++i)
168     {
169         o[i] = (O)l[i] + (O)r[i];
170         oc[i] = (O)lc[i];
171     }
172 }
173
174 // xC + xC
175 template<typename T, typename O> inline static void add(T* l, T* lc, size_t size, T* r, T* rc, O* o, O* oc)
176 {
177     for (size_t i = 0; i < size ; ++i)
178     {
179         o[i] = (O)l[i] + (O)r[i];
180         oc[i] = (O)lc[i] + (O)rc[i];
181     }
182 }
183
184 // x + [] and [] + x
185 template<typename T, typename O> inline static void add(T* l, size_t size, O* o)
186 {
187     for (size_t i = 0; i < size ; ++i)
188     {
189         o[i] = (O)l[i];
190     }
191 }
192
193 // xC + [] and [] + xC
194 template<typename T, typename O> inline static void add(T* l, T* lc, size_t size, O* o, O* oc)
195 {
196     for (size_t i = 0; i < size ; ++i)
197     {
198         o[i] = (O)l[i];
199         oc[i] = (O)lc[i];
200     }
201 }
202
203 //add matrix + scalar ( double, int, bool )
204 //x + x1
205 template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U r, O* o)
206 {
207     for (size_t i = 0; i < size ; ++i)
208     {
209         o[i] = (O)l[i] + (O)r;
210     }
211 }
212
213 //string version
214 inline static void add(wchar_t** l, size_t size, wchar_t* r, int* length , wchar_t** o)
215 {
216     for (size_t i = 0; i < size ; ++i)
217     {
218         os_swprintf(o[i], length[i], L"%ls%ls", l[i], r);
219     }
220 }
221
222 //xC + x1
223 template<typename T, typename U, typename O> inline static void add(T* l, T* lc, size_t size, U r, O* o, O* oc)
224 {
225     for (size_t i = 0; i < size ; ++i)
226     {
227         o[i] = (O)l[i] + (O)r;
228         oc[i] = (O)lc[i];
229     }
230 }
231
232 //x + x1C
233 template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U r, U rc, O* o, O* oc)
234 {
235     for (size_t i = 0; i < size ; ++i)
236     {
237         o[i] = (O)l[i] + (O) r;
238         oc[i] = (O)rc;
239     }
240 }
241
242 //xC + x1C )
243 template<typename T, typename O> inline static void add(T* l, T* lc, size_t size, T r, T rc, O* o, O* oc)
244 {
245     for (size_t i = 0; i < size ; ++i)
246     {
247         o[i] = (O)l[i] + (O)r;
248         oc[i] = (O)lc[i] + (O)rc;
249     }
250 }
251
252 //add scalar + matrix ( double, int, bool )
253 //x1 + x
254 template<typename T, typename U, typename O> inline static void add(T l, size_t size, U* r, O* o)
255 {
256     for (size_t i = 0; i < size ; ++i)
257     {
258         o[i] = (O)l + (O)r[i];
259     }
260 }
261
262 //string version
263 inline static void add(wchar_t* l, size_t size, wchar_t** r, int* length , wchar_t** o)
264 {
265     for (size_t i = 0; i < size ; ++i)
266     {
267         os_swprintf(o[i], length[i], L"%ls%ls", l, r[i]);
268     }
269 }
270
271 //x1 + xC
272 template<typename T, typename U, typename O> inline static void add(T l, size_t size, U* r, U* rc, O* o, O* oc)
273 {
274     for (size_t i = 0; i < size ; ++i)
275     {
276         o[i] = (O)l + (O)r[i];
277         oc[i] = (O)rc[i];
278     }
279 }
280
281 //x1C + x
282 template<typename T, typename U, typename O> inline static void add(T l, T lc, size_t size, U* r, O* o, O* oc)
283 {
284     for (size_t i = 0; i < size ; ++i)
285     {
286         o[i] = (O)l + (O)r[i];
287         oc[i] = (O)lc;
288     }
289 }
290
291 //x1C + xC
292 template<typename T, typename O> inline static void add(T l, T /*lc*/, size_t size, T* r, T* rc, O* o, O* oc)
293 {
294     for (size_t i = 0; i < size ; ++i)
295     {
296         o[i] = (O)l + (O)r[i];
297         oc[i] = (O)rc[i];
298     }
299 }
300
301
302 //add scalar + scalar ( double, int, bool )
303 //same type
304 template<typename T, typename O> inline static void add(T l, T r, O* o)
305 {
306     *o = (O)l + (O)r;
307 }
308 //x1 + x1
309 template<typename T, typename U, typename O> inline static void add(T l, U r, O* o)
310 {
311     *o = (O)l + (O)r;
312 }
313
314 //string version
315 inline static void add(wchar_t* l, wchar_t* r, int length , wchar_t* o)
316 {
317     os_swprintf(o, length, L"%ls%ls", l, r);
318 }
319
320 //x1C + x1C
321 template<typename T, typename U, typename O> inline static void add(T l, T lc, U r, U rc, O* o, O* oc)
322 {
323     *o = (O)l + (O)r;
324     *oc = (O)lc + (O)rc;
325 }
326
327 //x1 + [] and [] + x1
328 template<typename T, typename O> inline static void add(T l, O* o)
329 {
330     *o = (O)l;
331 }
332
333 //x1c + [] and [] + x1c
334 template<typename T, typename O> inline static void add(T l, T lc, O* o, O* oc)
335 {
336     *o = (O)l;
337     *oc = (O)lc;
338 }
339
340 //[] + []
341 inline static void add()
342 {
343 }
344
345
346 //Sparse
347 int AddSparseToSparse(types::Sparse *_pSparse1, types::Sparse *_pSparse2, types::Sparse** _pSparseOut);
348 int AddSparseToDouble(types::Sparse *_pSparse,  types::Double* _pDouble, types::GenericType** _pDoubleOut);
349 int AddDoubleToSparse(types::Double* _pDouble, types::Sparse* _pSparse, types::GenericType** _pDoubleOut);
350
351 #endif /* __TYPES_ADD_H__ */