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
add(T * l,size_t size,T * r,O * o)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
add(wchar_t ** l,size_t size,wchar_t ** r,int * length,wchar_t ** o)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
add(T * l,size_t size,U * r,O * o)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
add(T * l,size_t size,U * r,U * rc,O * o,O * oc)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
add(T * l,T * lc,size_t size,U * r,O * o,O * oc)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
add(T * l,T * lc,size_t size,T * r,T * rc,O * o,O * oc)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
add(T * l,size_t size,O * o)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
add(T * l,T * lc,size_t size,O * o,O * oc)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
add(T * l,size_t size,U r,O * o)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
add(wchar_t ** l,size_t size,wchar_t * r,int * length,wchar_t ** o)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
add(T * l,T * lc,size_t size,U r,O * o,O * oc)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
add(T * l,size_t size,U r,U rc,O * o,O * oc)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 )
add(T * l,T * lc,size_t size,T r,T rc,O * o,O * oc)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
add(T l,size_t size,U * r,O * o)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
add(wchar_t * l,size_t size,wchar_t ** r,int * length,wchar_t ** o)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
add(T l,size_t size,U * r,U * rc,O * o,O * oc)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
add(T l,T lc,size_t size,U * r,O * o,O * oc)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
add(T l,T,size_t size,T * r,T * rc,O * o,O * oc)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
add(T l,T r,O * o)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
add(T l,U r,O * o)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
add(wchar_t * l,wchar_t * r,int length,wchar_t * o)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
add(T l,T lc,U r,U rc,O * o,O * oc)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
add(T l,O * o)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
add(T l,T lc,O * o,O * oc)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 //[] + []
add()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__ */
352