Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / ast / src / cpp / operations / types_and.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
4  *  Copyright (C) 2016 - Scilab Enterprises - Pierre-Aimé AGNEL
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 extern "C"
17 {
18 #include "os_string.h"
19 }
20
21 #include "types_and.hxx"
22 #include "double.hxx"
23 #include "int.hxx"
24 #include "bool.hxx"
25 #include "sparse.hxx"
26
27 using namespace types;
28
29 //define arrays on operation functions
30 static and_function pAndfunction[types::InternalType::IdLast][types::InternalType::IdLast] = {NULL};
31
32 void fillAndFunction()
33 {
34 #define scilab_fill_and(id1, id2, func, typeIn1, typeIn2, typeOut) \
35     pAndfunction[types::InternalType::Id ## id1][types::InternalType::Id ## id2] = (and_function)&and_##func<typeIn1, typeIn2, typeOut>
36
37     //Double
38     scilab_fill_and(Double, Double, M_M, Double, Double, Bool);
39     scilab_fill_and(Double, Bool, M_M, Double, Bool, Bool);
40
41     scilab_fill_and(Double, ScalarDouble, M_S, Double, Double, Bool);
42     scilab_fill_and(Double, ScalarBool, M_S, Double, Bool, Bool);
43
44     scilab_fill_and(Double, Empty, M_E, Double, Double, Double);
45     scilab_fill_and(Double, Identity, M_S, Double, Double, Bool);
46
47     scilab_fill_and(ScalarDouble, Double, S_M, Double, Double, Bool);
48     scilab_fill_and(ScalarDouble, Bool, S_M, Double, Bool, Bool);
49
50     scilab_fill_and(ScalarDouble, ScalarDouble, S_S, Double, Double, Bool);
51     scilab_fill_and(ScalarDouble, ScalarBool, S_S, Double, Bool, Bool);
52
53     scilab_fill_and(ScalarDouble, Empty, M_E, Double, Double, Double);
54     scilab_fill_and(ScalarDouble, Identity, S_S, Double, Double, Bool);
55
56     //Bool
57     scilab_fill_and(Bool, Double, M_M, Bool, Double, Bool);
58     scilab_fill_and(Bool, Bool, M_M, Bool, Bool, Bool);
59
60     scilab_fill_and(Bool, ScalarDouble, M_S, Bool, Double, Bool);
61     scilab_fill_and(Bool, ScalarBool, M_S, Bool, Bool, Bool);
62
63     scilab_fill_and(Bool, Empty, M_E, Bool, Double, Bool);
64     scilab_fill_and(Bool, Identity, M_S, Bool, Double, Bool);
65
66     scilab_fill_and(ScalarBool, Double, S_M, Bool, Double, Bool);
67     scilab_fill_and(ScalarBool, Bool, S_M, Bool, Bool, Bool);
68
69     scilab_fill_and(ScalarBool, ScalarDouble, S_S, Bool, Double, Bool);
70     scilab_fill_and(ScalarBool, ScalarBool, S_S, Bool, Bool, Bool);
71
72     scilab_fill_and(ScalarBool, Empty, M_E, Bool, Double, Bool);
73     scilab_fill_and(ScalarBool, Identity, S_S, Bool, Double, Bool);
74
75     // []
76     scilab_fill_and(Empty, Double, E_M, Double, Double, Double);
77     scilab_fill_and(Empty, Bool, E_M, Double, Bool, Bool);
78     scilab_fill_and(Empty, ScalarDouble, E_M, Double, Double, Double);
79     scilab_fill_and(Empty, ScalarBool, E_M, Double, Bool, Bool);
80     scilab_fill_and(Empty, Empty, E_M, Double, Double, Double);
81     scilab_fill_and(Empty, Identity, E_M, Double, Double, Double);
82
83     // Identity
84     scilab_fill_and(Identity, Double, I_M, Double, Double, Bool);
85     scilab_fill_and(Identity, Bool, I_M, Double, Bool, Bool);
86
87     scilab_fill_and(Identity, ScalarDouble, I_S, Double, Double, Bool);
88     scilab_fill_and(Identity, ScalarBool, I_S, Double, Bool, Bool);
89
90     scilab_fill_and(Identity, Empty, M_E, Double, Double, Bool);
91     scilab_fill_and(Identity, Identity, I_S, Double, Double, Bool);
92
93
94     //int8
95     scilab_fill_and(Int8, Int8, int_M_M, Int8, Int8, Int8);
96     scilab_fill_and(Int8, UInt8, int_M_M, Int8, UInt8, UInt8);
97     scilab_fill_and(Int8, Int16, int_M_M, Int8, Int16, Int16);
98     scilab_fill_and(Int8, UInt16, int_M_M, Int8, UInt16, UInt16);
99     scilab_fill_and(Int8, Int32, int_M_M, Int8, Int32, Int32);
100     scilab_fill_and(Int8, UInt32, int_M_M, Int8, UInt32, UInt32);
101     scilab_fill_and(Int8, Int64, int_M_M, Int8, Int64, Int64);
102     scilab_fill_and(Int8, UInt64, int_M_M, Int8, UInt64, UInt64);
103
104     scilab_fill_and(Int8, ScalarInt8, int_M_S, Int8, Int8, Int8);
105     scilab_fill_and(Int8, ScalarUInt8, int_M_S, Int8, UInt8, UInt8);
106     scilab_fill_and(Int8, ScalarInt16, int_M_S, Int8, Int16, Int16);
107     scilab_fill_and(Int8, ScalarUInt16, int_M_S, Int8, UInt16, UInt16);
108     scilab_fill_and(Int8, ScalarInt32, int_M_S, Int8, Int32, Int32);
109     scilab_fill_and(Int8, ScalarUInt32, int_M_S, Int8, UInt32, UInt32);
110     scilab_fill_and(Int8, ScalarInt64, int_M_S, Int8, Int64, Int64);
111     scilab_fill_and(Int8, ScalarUInt64, int_M_S, Int8, UInt64, UInt64);
112
113     scilab_fill_and(ScalarInt8, Int8, int_S_M, Int8, Int8, Int8);
114     scilab_fill_and(ScalarInt8, UInt8, int_S_M, Int8, UInt8, UInt8);
115     scilab_fill_and(ScalarInt8, Int16, int_S_M, Int8, Int16, Int16);
116     scilab_fill_and(ScalarInt8, UInt16, int_S_M, Int8, UInt16, UInt16);
117     scilab_fill_and(ScalarInt8, Int32, int_S_M, Int8, Int32, Int32);
118     scilab_fill_and(ScalarInt8, UInt32, int_S_M, Int8, UInt32, UInt32);
119     scilab_fill_and(ScalarInt8, Int64, int_S_M, Int8, Int64, Int64);
120     scilab_fill_and(ScalarInt8, UInt64, int_S_M, Int8, UInt64, UInt64);
121
122     scilab_fill_and(ScalarInt8, ScalarInt8, int_S_S, Int8, Int8, Int8);
123     scilab_fill_and(ScalarInt8, ScalarUInt8, int_S_S, Int8, UInt8, UInt8);
124     scilab_fill_and(ScalarInt8, ScalarInt16, int_S_S, Int8, Int16, Int16);
125     scilab_fill_and(ScalarInt8, ScalarUInt16, int_S_S, Int8, UInt16, UInt16);
126     scilab_fill_and(ScalarInt8, ScalarInt32, int_S_S, Int8, Int32, Int32);
127     scilab_fill_and(ScalarInt8, ScalarUInt32, int_S_S, Int8, UInt32, UInt32);
128     scilab_fill_and(ScalarInt8, ScalarInt64, int_S_S, Int8, Int64, Int64);
129     scilab_fill_and(ScalarInt8, ScalarUInt64, int_S_S, Int8, UInt64, UInt64);
130
131     //uint8
132     scilab_fill_and(UInt8, Int8, int_M_M, UInt8, Int8, UInt8);
133     scilab_fill_and(UInt8, UInt8, int_M_M, UInt8, UInt8, UInt8);
134     scilab_fill_and(UInt8, Int16, int_M_M, UInt8, Int16, UInt16);
135     scilab_fill_and(UInt8, UInt16, int_M_M, UInt8, UInt16, UInt16);
136     scilab_fill_and(UInt8, Int32, int_M_M, UInt8, Int32, UInt32);
137     scilab_fill_and(UInt8, UInt32, int_M_M, UInt8, UInt32, UInt32);
138     scilab_fill_and(UInt8, Int64, int_M_M, UInt8, Int64, UInt64);
139     scilab_fill_and(UInt8, UInt64, int_M_M, UInt8, UInt64, UInt64);
140
141     scilab_fill_and(UInt8, ScalarInt8, int_M_S, UInt8, Int8, UInt8);
142     scilab_fill_and(UInt8, ScalarUInt8, int_M_S, UInt8, UInt8, UInt8);
143     scilab_fill_and(UInt8, ScalarInt16, int_M_S, UInt8, Int16, UInt16);
144     scilab_fill_and(UInt8, ScalarUInt16, int_M_S, UInt8, UInt16, UInt16);
145     scilab_fill_and(UInt8, ScalarInt32, int_M_S, UInt8, Int32, UInt32);
146     scilab_fill_and(UInt8, ScalarUInt32, int_M_S, UInt8, UInt32, UInt32);
147     scilab_fill_and(UInt8, ScalarInt64, int_M_S, UInt8, Int64, UInt64);
148     scilab_fill_and(UInt8, ScalarUInt64, int_M_S, UInt8, UInt64, UInt64);
149
150     scilab_fill_and(ScalarUInt8, Int8, int_S_M, UInt8, Int8, UInt8);
151     scilab_fill_and(ScalarUInt8, UInt8, int_S_M, UInt8, UInt8, UInt8);
152     scilab_fill_and(ScalarUInt8, Int16, int_S_M, UInt8, Int16, UInt16);
153     scilab_fill_and(ScalarUInt8, UInt16, int_S_M, UInt8, UInt16, UInt16);
154     scilab_fill_and(ScalarUInt8, Int32, int_S_M, UInt8, Int32, UInt32);
155     scilab_fill_and(ScalarUInt8, UInt32, int_S_M, UInt8, UInt32, UInt32);
156     scilab_fill_and(ScalarUInt8, Int64, int_S_M, UInt8, Int64, UInt64);
157     scilab_fill_and(ScalarUInt8, UInt64, int_S_M, UInt8, UInt64, UInt64);
158
159     scilab_fill_and(ScalarUInt8, ScalarInt8, int_S_S, UInt8, Int8, UInt8);
160     scilab_fill_and(ScalarUInt8, ScalarUInt8, int_S_S, UInt8, UInt8, UInt8);
161     scilab_fill_and(ScalarUInt8, ScalarInt16, int_S_S, UInt8, Int16, UInt16);
162     scilab_fill_and(ScalarUInt8, ScalarUInt16, int_S_S, UInt8, UInt16, UInt16);
163     scilab_fill_and(ScalarUInt8, ScalarInt32, int_S_S, UInt8, Int32, UInt32);
164     scilab_fill_and(ScalarUInt8, ScalarUInt32, int_S_S, UInt8, UInt32, UInt32);
165     scilab_fill_and(ScalarUInt8, ScalarInt64, int_S_S, UInt8, Int64, UInt64);
166     scilab_fill_and(ScalarUInt8, ScalarUInt64, int_S_S, UInt8, UInt64, UInt64);
167
168     //int16
169     scilab_fill_and(Int16, Int8, int_M_M, Int16, Int8, Int16);
170     scilab_fill_and(Int16, UInt8, int_M_M, Int16, UInt8, UInt16);
171     scilab_fill_and(Int16, Int16, int_M_M, Int16, Int16, Int16);
172     scilab_fill_and(Int16, UInt16, int_M_M, Int16, UInt16, UInt16);
173     scilab_fill_and(Int16, Int32, int_M_M, Int16, Int32, Int32);
174     scilab_fill_and(Int16, UInt32, int_M_M, Int16, UInt32, UInt32);
175     scilab_fill_and(Int16, Int64, int_M_M, Int16, Int64, Int64);
176     scilab_fill_and(Int16, UInt64, int_M_M, Int16, UInt64, UInt64);
177
178     scilab_fill_and(Int16, ScalarInt8, int_M_S, Int16, Int8, Int16);
179     scilab_fill_and(Int16, ScalarUInt8, int_M_S, Int16, UInt8, UInt16);
180     scilab_fill_and(Int16, ScalarInt16, int_M_S, Int16, Int16, Int16);
181     scilab_fill_and(Int16, ScalarUInt16, int_M_S, Int16, UInt16, UInt16);
182     scilab_fill_and(Int16, ScalarInt32, int_M_S, Int16, Int32, Int32);
183     scilab_fill_and(Int16, ScalarUInt32, int_M_S, Int16, UInt32, UInt32);
184     scilab_fill_and(Int16, ScalarInt64, int_M_S, Int16, Int64, Int64);
185     scilab_fill_and(Int16, ScalarUInt64, int_M_S, Int16, UInt64, UInt64);
186
187     scilab_fill_and(ScalarInt16, Int8, int_S_M, Int16, Int8, Int16);
188     scilab_fill_and(ScalarInt16, UInt8, int_S_M, Int16, UInt8, UInt16);
189     scilab_fill_and(ScalarInt16, Int16, int_S_M, Int16, Int16, Int16);
190     scilab_fill_and(ScalarInt16, UInt16, int_S_M, Int16, UInt16, UInt16);
191     scilab_fill_and(ScalarInt16, Int32, int_S_M, Int16, Int32, Int32);
192     scilab_fill_and(ScalarInt16, UInt32, int_S_M, Int16, UInt32, UInt32);
193     scilab_fill_and(ScalarInt16, Int64, int_S_M, Int16, Int64, Int64);
194     scilab_fill_and(ScalarInt16, UInt64, int_S_M, Int16, UInt64, UInt64);
195
196     scilab_fill_and(ScalarInt16, ScalarInt8, int_S_S, Int16, Int8, Int16);
197     scilab_fill_and(ScalarInt16, ScalarUInt8, int_S_S, Int16, UInt8, UInt16);
198     scilab_fill_and(ScalarInt16, ScalarInt16, int_S_S, Int16, Int16, Int16);
199     scilab_fill_and(ScalarInt16, ScalarUInt16, int_S_S, Int16, UInt16, UInt16);
200     scilab_fill_and(ScalarInt16, ScalarInt32, int_S_S, Int16, Int32, Int32);
201     scilab_fill_and(ScalarInt16, ScalarUInt32, int_S_S, Int16, UInt32, UInt32);
202     scilab_fill_and(ScalarInt16, ScalarInt64, int_S_S, Int16, Int64, Int64);
203     scilab_fill_and(ScalarInt16, ScalarUInt64, int_S_S, Int16, UInt64, UInt64);
204
205     //uint16
206     scilab_fill_and(UInt16, Int8, int_M_M, UInt16, Int8, UInt16);
207     scilab_fill_and(UInt16, UInt8, int_M_M, UInt16, UInt8, UInt16);
208     scilab_fill_and(UInt16, Int16, int_M_M, UInt16, Int16, UInt16);
209     scilab_fill_and(UInt16, UInt16, int_M_M, UInt16, UInt16, UInt16);
210     scilab_fill_and(UInt16, Int32, int_M_M, UInt16, Int32, UInt32);
211     scilab_fill_and(UInt16, UInt32, int_M_M, UInt16, UInt32, UInt32);
212     scilab_fill_and(UInt16, Int64, int_M_M, UInt16, Int64, UInt64);
213     scilab_fill_and(UInt16, UInt64, int_M_M, UInt16, UInt64, UInt64);
214
215     scilab_fill_and(UInt16, ScalarInt8, int_M_S, UInt16, Int8, UInt16);
216     scilab_fill_and(UInt16, ScalarUInt8, int_M_S, UInt16, UInt8, UInt16);
217     scilab_fill_and(UInt16, ScalarInt16, int_M_S, UInt16, Int16, UInt16);
218     scilab_fill_and(UInt16, ScalarUInt16, int_M_S, UInt16, UInt16, UInt16);
219     scilab_fill_and(UInt16, ScalarInt32, int_M_S, UInt16, Int32, UInt32);
220     scilab_fill_and(UInt16, ScalarUInt32, int_M_S, UInt16, UInt32, UInt32);
221     scilab_fill_and(UInt16, ScalarInt64, int_M_S, UInt16, Int64, UInt64);
222     scilab_fill_and(UInt16, ScalarUInt64, int_M_S, UInt16, UInt64, UInt64);
223
224     scilab_fill_and(ScalarUInt16, Int8, int_S_M, UInt16, Int8, UInt16);
225     scilab_fill_and(ScalarUInt16, UInt8, int_S_M, UInt16, UInt8, UInt16);
226     scilab_fill_and(ScalarUInt16, Int16, int_S_M, UInt16, Int16, UInt16);
227     scilab_fill_and(ScalarUInt16, UInt16, int_S_M, UInt16, UInt16, UInt16);
228     scilab_fill_and(ScalarUInt16, Int32, int_S_M, UInt16, Int32, UInt32);
229     scilab_fill_and(ScalarUInt16, UInt32, int_S_M, UInt16, UInt32, UInt32);
230     scilab_fill_and(ScalarUInt16, Int64, int_S_M, UInt16, Int64, UInt64);
231     scilab_fill_and(ScalarUInt16, UInt64, int_S_M, UInt16, UInt64, UInt64);
232
233     scilab_fill_and(ScalarUInt16, ScalarInt8, int_S_S, UInt16, Int8, UInt16);
234     scilab_fill_and(ScalarUInt16, ScalarUInt8, int_S_S, UInt16, UInt8, UInt16);
235     scilab_fill_and(ScalarUInt16, ScalarInt16, int_S_S, UInt16, Int16, UInt16);
236     scilab_fill_and(ScalarUInt16, ScalarUInt16, int_S_S, UInt16, UInt16, UInt16);
237     scilab_fill_and(ScalarUInt16, ScalarInt32, int_S_S, UInt16, Int32, UInt32);
238     scilab_fill_and(ScalarUInt16, ScalarUInt32, int_S_S, UInt16, UInt32, UInt32);
239     scilab_fill_and(ScalarUInt16, ScalarInt64, int_S_S, UInt16, Int64, UInt64);
240     scilab_fill_and(ScalarUInt16, ScalarUInt64, int_S_S, UInt16, UInt64, UInt64);
241
242     //int32
243     scilab_fill_and(Int32, Int8, int_M_M, Int32, Int8, Int32);
244     scilab_fill_and(Int32, UInt8, int_M_M, Int32, UInt8, UInt32);
245     scilab_fill_and(Int32, Int16, int_M_M, Int32, Int16, Int32);
246     scilab_fill_and(Int32, UInt16, int_M_M, Int32, UInt16, UInt32);
247     scilab_fill_and(Int32, Int32, int_M_M, Int32, Int32, Int32);
248     scilab_fill_and(Int32, UInt32, int_M_M, Int32, UInt32, UInt32);
249     scilab_fill_and(Int32, Int64, int_M_M, Int32, Int64, Int64);
250     scilab_fill_and(Int32, UInt64, int_M_M, Int32, UInt64, UInt64);
251
252     scilab_fill_and(Int32, ScalarInt8, int_M_S, Int32, Int8, Int32);
253     scilab_fill_and(Int32, ScalarUInt8, int_M_S, Int32, UInt8, UInt32);
254     scilab_fill_and(Int32, ScalarInt16, int_M_S, Int32, Int16, Int32);
255     scilab_fill_and(Int32, ScalarUInt16, int_M_S, Int32, UInt16, UInt32);
256     scilab_fill_and(Int32, ScalarInt32, int_M_S, Int32, Int32, Int32);
257     scilab_fill_and(Int32, ScalarUInt32, int_M_S, Int32, UInt32, UInt32);
258     scilab_fill_and(Int32, ScalarInt64, int_M_S, Int32, Int64, Int64);
259     scilab_fill_and(Int32, ScalarUInt64, int_M_S, Int32, UInt64, UInt64);
260
261     scilab_fill_and(ScalarInt32, Int8, int_S_M, Int32, Int8, Int32);
262     scilab_fill_and(ScalarInt32, UInt8, int_S_M, Int32, UInt8, UInt32);
263     scilab_fill_and(ScalarInt32, Int16, int_S_M, Int32, Int16, Int32);
264     scilab_fill_and(ScalarInt32, UInt16, int_S_M, Int32, UInt16, UInt32);
265     scilab_fill_and(ScalarInt32, Int32, int_S_M, Int32, Int32, Int32);
266     scilab_fill_and(ScalarInt32, UInt32, int_S_M, Int32, UInt32, UInt32);
267     scilab_fill_and(ScalarInt32, Int64, int_S_M, Int32, Int64, Int64);
268     scilab_fill_and(ScalarInt32, UInt64, int_S_M, Int32, UInt64, UInt64);
269
270     scilab_fill_and(ScalarInt32, ScalarInt8, int_S_S, Int32, Int8, Int32);
271     scilab_fill_and(ScalarInt32, ScalarUInt8, int_S_S, Int32, UInt8, UInt32);
272     scilab_fill_and(ScalarInt32, ScalarInt16, int_S_S, Int32, Int16, Int32);
273     scilab_fill_and(ScalarInt32, ScalarUInt16, int_S_S, Int32, UInt16, UInt32);
274     scilab_fill_and(ScalarInt32, ScalarInt32, int_S_S, Int32, Int32, Int32);
275     scilab_fill_and(ScalarInt32, ScalarUInt32, int_S_S, Int32, UInt32, UInt32);
276     scilab_fill_and(ScalarInt32, ScalarInt64, int_S_S, Int32, Int64, Int64);
277     scilab_fill_and(ScalarInt32, ScalarUInt64, int_S_S, Int32, UInt64, UInt64);
278
279     //uint32
280     scilab_fill_and(UInt32, Int8, int_M_M, UInt32, Int8, UInt32);
281     scilab_fill_and(UInt32, UInt8, int_M_M, UInt32, UInt8, UInt32);
282     scilab_fill_and(UInt32, Int16, int_M_M, UInt32, Int16, UInt32);
283     scilab_fill_and(UInt32, UInt16, int_M_M, UInt32, UInt16, UInt32);
284     scilab_fill_and(UInt32, Int32, int_M_M, UInt32, Int32, UInt32);
285     scilab_fill_and(UInt32, UInt32, int_M_M, UInt32, UInt32, UInt32);
286     scilab_fill_and(UInt32, Int64, int_M_M, UInt32, Int64, UInt64);
287     scilab_fill_and(UInt32, UInt64, int_M_M, UInt32, UInt64, UInt64);
288
289     scilab_fill_and(UInt32, ScalarInt8, int_M_S, UInt32, Int8, UInt32);
290     scilab_fill_and(UInt32, ScalarUInt8, int_M_S, UInt32, UInt8, UInt32);
291     scilab_fill_and(UInt32, ScalarInt16, int_M_S, UInt32, Int16, UInt32);
292     scilab_fill_and(UInt32, ScalarUInt16, int_M_S, UInt32, UInt16, UInt32);
293     scilab_fill_and(UInt32, ScalarInt32, int_M_S, UInt32, Int32, UInt32);
294     scilab_fill_and(UInt32, ScalarUInt32, int_M_S, UInt32, UInt32, UInt32);
295     scilab_fill_and(UInt32, ScalarInt64, int_M_S, UInt32, Int64, UInt64);
296     scilab_fill_and(UInt32, ScalarUInt64, int_M_S, UInt32, UInt64, UInt64);
297
298     scilab_fill_and(ScalarUInt32, Int8, int_S_M, UInt32, Int8, UInt32);
299     scilab_fill_and(ScalarUInt32, UInt8, int_S_M, UInt32, UInt8, UInt32);
300     scilab_fill_and(ScalarUInt32, Int16, int_S_M, UInt32, Int16, UInt32);
301     scilab_fill_and(ScalarUInt32, UInt16, int_S_M, UInt32, UInt16, UInt32);
302     scilab_fill_and(ScalarUInt32, Int32, int_S_M, UInt32, Int32, UInt32);
303     scilab_fill_and(ScalarUInt32, UInt32, int_S_M, UInt32, UInt32, UInt32);
304     scilab_fill_and(ScalarUInt32, Int64, int_S_M, UInt32, Int64, UInt64);
305     scilab_fill_and(ScalarUInt32, UInt64, int_S_M, UInt32, UInt64, UInt64);
306
307     scilab_fill_and(ScalarUInt32, ScalarInt8, int_S_S, UInt32, Int8, UInt32);
308     scilab_fill_and(ScalarUInt32, ScalarUInt8, int_S_S, UInt32, UInt8, UInt32);
309     scilab_fill_and(ScalarUInt32, ScalarInt16, int_S_S, UInt32, Int16, UInt32);
310     scilab_fill_and(ScalarUInt32, ScalarUInt16, int_S_S, UInt32, UInt16, UInt32);
311     scilab_fill_and(ScalarUInt32, ScalarInt32, int_S_S, UInt32, Int32, UInt32);
312     scilab_fill_and(ScalarUInt32, ScalarUInt32, int_S_S, UInt32, UInt32, UInt32);
313     scilab_fill_and(ScalarUInt32, ScalarInt64, int_S_S, UInt32, Int64, UInt64);
314     scilab_fill_and(ScalarUInt32, ScalarUInt64, int_S_S, UInt32, UInt64, UInt64);
315
316     //int64
317     scilab_fill_and(Int64, Int8, int_M_M, Int64, Int8, Int64);
318     scilab_fill_and(Int64, UInt8, int_M_M, Int64, UInt8, UInt64);
319     scilab_fill_and(Int64, Int16, int_M_M, Int64, Int16, Int64);
320     scilab_fill_and(Int64, UInt16, int_M_M, Int64, UInt16, UInt64);
321     scilab_fill_and(Int64, Int32, int_M_M, Int64, Int32, Int64);
322     scilab_fill_and(Int64, UInt32, int_M_M, Int64, UInt32, UInt64);
323     scilab_fill_and(Int64, Int64, int_M_M, Int64, Int64, Int64);
324     scilab_fill_and(Int64, UInt64, int_M_M, Int64, UInt64, UInt64);
325
326     scilab_fill_and(Int64, ScalarInt8, int_M_S, Int64, Int8, Int64);
327     scilab_fill_and(Int64, ScalarUInt8, int_M_S, Int64, UInt8, UInt64);
328     scilab_fill_and(Int64, ScalarInt16, int_M_S, Int64, Int16, Int64);
329     scilab_fill_and(Int64, ScalarUInt16, int_M_S, Int64, UInt16, UInt64);
330     scilab_fill_and(Int64, ScalarInt32, int_M_S, Int64, Int32, Int64);
331     scilab_fill_and(Int64, ScalarUInt32, int_M_S, Int64, UInt32, UInt64);
332     scilab_fill_and(Int64, ScalarInt64, int_M_S, Int64, Int64, Int64);
333     scilab_fill_and(Int64, ScalarUInt64, int_M_S, Int64, UInt64, UInt64);
334
335     scilab_fill_and(ScalarInt64, Int8, int_S_M, Int64, Int8, Int64);
336     scilab_fill_and(ScalarInt64, UInt8, int_S_M, Int64, UInt8, UInt64);
337     scilab_fill_and(ScalarInt64, Int16, int_S_M, Int64, Int16, Int64);
338     scilab_fill_and(ScalarInt64, UInt16, int_S_M, Int64, UInt16, UInt64);
339     scilab_fill_and(ScalarInt64, Int32, int_S_M, Int64, Int32, Int64);
340     scilab_fill_and(ScalarInt64, UInt32, int_S_M, Int64, UInt32, UInt64);
341     scilab_fill_and(ScalarInt64, Int64, int_S_M, Int64, Int64, Int64);
342     scilab_fill_and(ScalarInt64, UInt64, int_S_M, Int64, UInt64, UInt64);
343
344     scilab_fill_and(ScalarInt64, ScalarInt8, int_S_S, Int64, Int8, Int64);
345     scilab_fill_and(ScalarInt64, ScalarUInt8, int_S_S, Int64, UInt8, UInt64);
346     scilab_fill_and(ScalarInt64, ScalarInt16, int_S_S, Int64, Int16, Int64);
347     scilab_fill_and(ScalarInt64, ScalarUInt16, int_S_S, Int64, UInt16, UInt64);
348     scilab_fill_and(ScalarInt64, ScalarInt32, int_S_S, Int64, Int32, Int64);
349     scilab_fill_and(ScalarInt64, ScalarUInt32, int_S_S, Int64, UInt32, UInt64);
350     scilab_fill_and(ScalarInt64, ScalarInt64, int_S_S, Int64, Int64, Int64);
351     scilab_fill_and(ScalarInt64, ScalarUInt64, int_S_S, Int64, UInt64, UInt64);
352
353     //uint64
354     scilab_fill_and(UInt64, Int8, int_M_M, UInt64, Int8, UInt64);
355     scilab_fill_and(UInt64, UInt8, int_M_M, UInt64, UInt8, UInt64);
356     scilab_fill_and(UInt64, Int16, int_M_M, UInt64, Int16, UInt64);
357     scilab_fill_and(UInt64, UInt16, int_M_M, UInt64, UInt16, UInt64);
358     scilab_fill_and(UInt64, Int32, int_M_M, UInt64, Int32, UInt64);
359     scilab_fill_and(UInt64, UInt32, int_M_M, UInt64, UInt32, UInt64);
360     scilab_fill_and(UInt64, Int64, int_M_M, UInt64, Int64, UInt64);
361     scilab_fill_and(UInt64, UInt64, int_M_M, UInt64, UInt64, UInt64);
362
363     scilab_fill_and(UInt64, ScalarInt8, int_M_S, UInt64, Int8, UInt64);
364     scilab_fill_and(UInt64, ScalarUInt8, int_M_S, UInt64, UInt8, UInt64);
365     scilab_fill_and(UInt64, ScalarInt16, int_M_S, UInt64, Int16, UInt64);
366     scilab_fill_and(UInt64, ScalarUInt16, int_M_S, UInt64, UInt16, UInt64);
367     scilab_fill_and(UInt64, ScalarInt32, int_M_S, UInt64, Int32, UInt64);
368     scilab_fill_and(UInt64, ScalarUInt32, int_M_S, UInt64, UInt32, UInt64);
369     scilab_fill_and(UInt64, ScalarInt64, int_M_S, UInt64, Int64, UInt64);
370     scilab_fill_and(UInt64, ScalarUInt64, int_M_S, UInt64, UInt64, UInt64);
371
372     scilab_fill_and(ScalarUInt64, Int8, int_S_M, UInt64, Int8, UInt64);
373     scilab_fill_and(ScalarUInt64, UInt8, int_S_M, UInt64, UInt8, UInt64);
374     scilab_fill_and(ScalarUInt64, Int16, int_S_M, UInt64, Int16, UInt64);
375     scilab_fill_and(ScalarUInt64, UInt16, int_S_M, UInt64, UInt16, UInt64);
376     scilab_fill_and(ScalarUInt64, Int32, int_S_M, UInt64, Int32, UInt64);
377     scilab_fill_and(ScalarUInt64, UInt32, int_S_M, UInt64, UInt32, UInt64);
378     scilab_fill_and(ScalarUInt64, Int64, int_S_M, UInt64, Int64, UInt64);
379     scilab_fill_and(ScalarUInt64, UInt64, int_S_M, UInt64, UInt64, UInt64);
380
381     scilab_fill_and(ScalarUInt64, ScalarInt8, int_S_S, UInt64, Int8, UInt64);
382     scilab_fill_and(ScalarUInt64, ScalarUInt8, int_S_S, UInt64, UInt8, UInt64);
383     scilab_fill_and(ScalarUInt64, ScalarInt16, int_S_S, UInt64, Int16, UInt64);
384     scilab_fill_and(ScalarUInt64, ScalarUInt16, int_S_S, UInt64, UInt16, UInt64);
385     scilab_fill_and(ScalarUInt64, ScalarInt32, int_S_S, UInt64, Int32, UInt64);
386     scilab_fill_and(ScalarUInt64, ScalarUInt32, int_S_S, UInt64, UInt32, UInt64);
387     scilab_fill_and(ScalarUInt64, ScalarInt64, int_S_S, UInt64, Int64, UInt64);
388     scilab_fill_and(ScalarUInt64, ScalarUInt64, int_S_S, UInt64, UInt64, UInt64);
389
390     //boolean sparse
391     scilab_fill_and(SparseBool, SparseBool, M_M, SparseBool, SparseBool, SparseBool);
392     scilab_fill_and(Bool, SparseBool, M_M, Bool, SparseBool, SparseBool);
393     scilab_fill_and(SparseBool, Bool, M_M, SparseBool, Bool, SparseBool);
394     scilab_fill_and(ScalarBool, SparseBool, M_M, Bool, SparseBool, SparseBool);
395     scilab_fill_and(SparseBool, ScalarBool, M_M, SparseBool, Bool, SparseBool);
396
397 #undef scilab_fill_and
398 }
399
400 // &&
401 InternalType* GenericShortcutAnd(InternalType* _pL)
402 {
403     InternalType* pResult = NULL;
404     switch (_pL->getType())
405     {
406         case InternalType::ScilabBool :
407             isValueFalse(_pL->getAs<Bool>(), (Bool**)&pResult);
408             break;
409         case InternalType::ScilabDouble :
410             isValueFalse(_pL->getAs<Double>(), (Bool**)&pResult);
411             break;
412         case InternalType::ScilabInt8 :
413             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
414             break;
415         case InternalType::ScilabUInt8 :
416             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
417             break;
418         case InternalType::ScilabInt16 :
419             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
420             break;
421         case InternalType::ScilabUInt16 :
422             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
423             break;
424         case InternalType::ScilabInt32 :
425             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
426             break;
427         case InternalType::ScilabUInt32 :
428             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
429             break;
430         case InternalType::ScilabInt64 :
431             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
432             break;
433         case InternalType::ScilabUInt64 :
434             isValueFalse(_pL->getAs<Int8>(), (Bool**)&pResult);
435             break;
436         case InternalType::ScilabSparse :
437             isValueFalse(_pL->getAs<SparseBool>(), (Bool**)&pResult);
438             break;
439         case InternalType::ScilabSparseBool :
440             isValueFalse(_pL->getAs<SparseBool>(), (Bool**)&pResult);
441             break;
442         default:
443             // will return NULL
444             break;
445     }
446
447     return pResult;
448 }
449
450 template<typename T>
451 void isValueFalse(T* _pL, types::Bool** _pOut)
452 {
453     for (int i = 0 ; i < _pL->getSize() ; i++)
454     {
455         if (_pL->get(i) == 0)
456         {
457             if ( !_pL->isComplex() || (_pL->getImg(i) == 0) )
458             {
459                 *_pOut = new Bool(0); //false && something -> false
460                 return;
461             }
462         }
463     }
464
465     //call non shortcut operation
466     *_pOut = NULL;
467     return;
468 }
469
470 template<>
471 void isValueFalse(Double* _pL, Bool** _pOut)
472 {
473     if (_pL->isEmpty())
474     {
475         //call non shorcut operation
476         *_pOut = NULL;
477         return;
478     }
479
480     for (int i = 0 ; i < _pL->getSize() ; i++)
481     {
482         if (_pL->get(i) == 0)
483         {
484             if ( !_pL->isComplex() || (_pL->getImg(i) == 0) )
485             {
486                 *_pOut = new Bool(0); //false && something -> false
487                 return;
488             }
489         }
490     }
491
492     //call non shortcut operation
493     *_pOut = NULL;
494     return;
495 }
496
497 template<>
498 void isValueFalse(Sparse* _pL, Bool** _pOut)
499 {
500     if (_pL->nonZeros() != (size_t)_pL->getSize())
501     {
502         *_pOut = new Bool(0);
503         return;
504     }
505
506     *_pOut = NULL;
507     return;
508 }
509
510 template<>
511 void isValueFalse(SparseBool* _pL, Bool** _pOut)
512 {
513     if (_pL->nbTrue() != (size_t)_pL->getSize())
514     {
515         *_pOut = new Bool(0);
516         return;
517     }
518
519     *_pOut = NULL;
520     return;
521 }
522
523 // &
524 InternalType* GenericLogicalAnd(InternalType* _pL, InternalType* _pR)
525 {
526     InternalType *pResult = NULL;
527
528     and_function bit_and = pAndfunction[_pL->getId()][_pR->getId()];
529     if (bit_and)
530     {
531         pResult = bit_and(_pL, _pR);
532         if (pResult)
533         {
534             return pResult;
535         }
536     }
537
538     /*
539     ** Default case : Return NULL will Call Overloading.
540     */
541     return NULL;
542 }
543
544 template<class T, class U, class O>
545 InternalType* and_M_M(T *_pL, U *_pR)
546 {
547     int iDimsL = _pL->getDims();
548     int iDimsR = _pR->getDims();
549
550     if (iDimsL != iDimsR)
551     {
552         return nullptr;
553     }
554
555     int* piDimsL = _pL->getDimsArray();
556     int* piDimsR = _pR->getDimsArray();
557
558     for (int i = 0 ; i < iDimsL ; ++i)
559     {
560         if (piDimsL[i] != piDimsR[i])
561         {
562             throw ast::InternalError(_("Inconsistent row/column dimensions.\n"));
563         }
564     }
565
566     O* pOut = new O(iDimsL, piDimsL);
567
568     bit_and(_pL->get(), (long long)_pL->getSize(), _pR->get(), pOut->get());
569     return pOut;
570 }
571
572 template<class T, class U, class O>
573 InternalType* and_S_M(T *_pL, U *_pR)
574 {
575     O* pOut = new O(_pR->getDims(), _pR->getDimsArray());
576     bit_and(_pL->get(0), (size_t)_pR->getSize(), _pR->get(), pOut->get());
577     return pOut;
578 }
579
580 template<class T, class U, class O>
581 InternalType* and_M_S(T *_pL, U *_pR)
582 {
583     O* pOut = new O(_pL->getDims(), _pL->getDimsArray());
584     bit_and(_pL->get(), (size_t)_pL->getSize(), _pR->get(0), pOut->get());
585     return pOut;
586 }
587
588 template<class T, class U, class O>
589 InternalType* and_S_S(T *_pL, U *_pR)
590 {
591     O* pOut = new O(_pL->getDims(), _pL->getDimsArray());
592     bit_and(_pL->get(0), _pR->get(0), pOut->get());
593     return pOut;
594 }
595
596 template<class T, class U, class O>
597 InternalType* and_M_E(T * /*_pL*/, U *_pR)
598 {
599     return _pR;
600 }
601
602 template<class T, class U, class O>
603 InternalType* and_E_M(T *_pL, U * /*_pR*/)
604 {
605     return _pL;
606 }
607
608 template<>
609 InternalType* and_E_M<Double, Bool, Bool>(Double* /* _pL */, Bool* _pR)
610 {
611     return _pR;
612 }
613
614 template<>
615 InternalType* and_M_E<Bool, Double, Bool>(Bool* _pL, Double* /* _pR */)
616 {
617     return _pL;
618 }
619
620 template<class T, class U, class O>
621 InternalType* and_I_S(T *_pL, U *_pR)
622 {
623     return and_S_S<U, T, O>(_pR, _pL);
624 }
625
626 template<class T, class U, class O>
627 InternalType* and_I_M(T *_pL, U *_pR)
628 {
629     return and_M_S<U, T, O>(_pR, _pL);
630 }
631
632
633 template<class T, class U, class O>
634 InternalType* and_int_M_M(T *_pL, U *_pR)
635 {
636     int iDimsL = _pL->getDims();
637     int iDimsR = _pR->getDims();
638
639     if (iDimsL != iDimsR)
640     {
641         return nullptr;
642     }
643
644     int* piDimsL = _pL->getDimsArray();
645     int* piDimsR = _pR->getDimsArray();
646
647     for (int i = 0 ; i < iDimsL ; ++i)
648     {
649         if (piDimsL[i] != piDimsR[i])
650         {
651             throw ast::InternalError(_("Inconsistent row/column dimensions.\n"));
652         }
653     }
654
655     O* pOut = new O(iDimsL, piDimsL);
656
657     int_and(_pL->get(), (long long)_pL->getSize(), _pR->get(), pOut->get());
658     return pOut;
659 }
660
661 template<class T, class U, class O>
662 InternalType* and_int_S_M(T *_pL, U *_pR)
663 {
664     O* pOut = new O(_pR->getDims(), _pR->getDimsArray());
665     int_and(_pL->get(0), (size_t)_pR->getSize(), _pR->get(), pOut->get());
666     return pOut;
667 }
668
669 template<class T, class U, class O>
670 InternalType* and_int_M_S(T *_pL, U *_pR)
671 {
672     O* pOut = new O(_pL->getDims(), _pL->getDimsArray());
673     int_and(_pL->get(), (size_t)_pL->getSize(), _pR->get(0), pOut->get());
674     return pOut;
675 }
676
677 template<class T, class U, class O>
678 InternalType* and_int_S_S(T *_pL, U *_pR)
679 {
680     O* pOut = new O(_pL->getDims(), _pL->getDimsArray());
681     int_and(_pL->get(0), _pR->get(0), pOut->get());
682     return pOut;
683 }
684
685 //boolean sparse
686 template<>
687 InternalType* and_M_M<SparseBool, SparseBool, SparseBool>(SparseBool* _pL, SparseBool* _pR)
688 {
689     SparseBool* pOut = NULL;
690     if (_pL->isScalar())
691     {
692         if (_pL->get(0, 0))
693         {
694             pOut = _pR;
695         }
696         else
697         {
698             pOut = new SparseBool(_pR->getRows(), _pR->getCols());
699         }
700
701         return pOut;
702     }
703
704     if (_pR->isScalar())
705     {
706         if (_pR->get(0, 0))
707         {
708             pOut = _pL;
709         }
710         else
711         {
712             pOut = new SparseBool(_pL->getRows(), _pL->getCols());
713         }
714
715         return pOut;
716     }
717
718     if (_pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
719     {
720         throw ast::InternalError(_("Inconsistent row/column dimensions.\n"));
721     }
722
723     return _pL->newLogicalAnd(*_pR);
724 }
725
726 template<>
727 InternalType* and_M_M<SparseBool, Bool, SparseBool>(SparseBool* _pL, Bool* _pR)
728 {
729     SparseBool* pR = new SparseBool(*_pR);
730     InternalType* pOut = and_M_M<SparseBool, SparseBool, SparseBool>(_pL, pR);
731     if (pOut != pR)
732     {
733         delete pR;
734     }
735
736     return pOut;
737 }
738
739 template<>
740 InternalType* and_M_M<Bool, SparseBool, SparseBool>(Bool* _pL, SparseBool* _pR)
741 {
742     SparseBool* pL = new SparseBool(*_pL);
743     InternalType* pOut = and_M_M<SparseBool, SparseBool, SparseBool>(pL, _pR);
744     if (pOut != pL)
745     {
746         delete pL;
747     }
748     return pOut;
749 }
750