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