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