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