* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / operations / types_comparison_eq.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
4  *  Copyright (C) 2015 - Scilab Enterprises - Sylvain GENIN
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 #ifndef __TYPES_COMPARISON_EQUAL_HXX__
18 #define __TYPES_COMPARISON_EQUAL_HXX__
19
20 #include "generic_operations.hxx"
21 #include "internal.hxx"
22 #include "double.hxx"
23 #include "sparse.hxx"
24 #include "polynom.hxx"
25 #include "string.hxx"
26 #include "struct.hxx"
27 #include "cell.hxx"
28 #include "graphichandle.hxx"
29 #include "macrofile.hxx"
30
31 void fillComparisonEqualFunction();
32
33 //define arrays on operation functions
34 typedef types::InternalType*(*compequal_function)(types::InternalType*, types::InternalType*);
35
36 #define DECLARE_COMPARISON_EQUAL_PROTO(x) template<class T, class U, class O> types::InternalType* x(T *_pL, U *_pR)
37
38
39 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_M);
40 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_MC);
41 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_S);
42 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_SC);
43 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_E);
44 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_I);
45 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_IC);
46
47 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MC_M);
48 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MC_MC);
49 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MC_S);
50 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MC_SC);
51 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MC_I);
52 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MC_IC);
53
54 DECLARE_COMPARISON_EQUAL_PROTO(compequal_S_M);
55 DECLARE_COMPARISON_EQUAL_PROTO(compequal_S_MC);
56 DECLARE_COMPARISON_EQUAL_PROTO(compequal_S_S);
57 DECLARE_COMPARISON_EQUAL_PROTO(compequal_S_SC);
58 DECLARE_COMPARISON_EQUAL_PROTO(compequal_S_I);
59 DECLARE_COMPARISON_EQUAL_PROTO(compequal_S_IC);
60
61 DECLARE_COMPARISON_EQUAL_PROTO(compequal_SC_M);
62 DECLARE_COMPARISON_EQUAL_PROTO(compequal_SC_MC);
63 DECLARE_COMPARISON_EQUAL_PROTO(compequal_SC_S);
64 DECLARE_COMPARISON_EQUAL_PROTO(compequal_SC_SC);
65 DECLARE_COMPARISON_EQUAL_PROTO(compequal_SC_I);
66 DECLARE_COMPARISON_EQUAL_PROTO(compequal_SC_IC);
67
68 //[]
69 DECLARE_COMPARISON_EQUAL_PROTO(compequal_E_M);
70 DECLARE_COMPARISON_EQUAL_PROTO(compequal_E_E);
71
72 //eye
73 DECLARE_COMPARISON_EQUAL_PROTO(compequal_I_M);
74 DECLARE_COMPARISON_EQUAL_PROTO(compequal_I_MC);
75 DECLARE_COMPARISON_EQUAL_PROTO(compequal_I_S);
76 DECLARE_COMPARISON_EQUAL_PROTO(compequal_I_SC);
77 DECLARE_COMPARISON_EQUAL_PROTO(compequal_I_I);
78 DECLARE_COMPARISON_EQUAL_PROTO(compequal_I_IC);
79
80 DECLARE_COMPARISON_EQUAL_PROTO(compequal_IC_M);
81 DECLARE_COMPARISON_EQUAL_PROTO(compequal_IC_MC);
82 DECLARE_COMPARISON_EQUAL_PROTO(compequal_IC_S);
83 DECLARE_COMPARISON_EQUAL_PROTO(compequal_IC_SC);
84 DECLARE_COMPARISON_EQUAL_PROTO(compequal_IC_I);
85 DECLARE_COMPARISON_EQUAL_PROTO(compequal_IC_IC);
86
87 DECLARE_COMPARISON_EQUAL_PROTO(compequal_P_M);
88 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_P);
89
90 DECLARE_COMPARISON_EQUAL_PROTO(compequal_SP_M);
91 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_SP);
92
93 DECLARE_COMPARISON_EQUAL_PROTO(compequal_B_M);
94 DECLARE_COMPARISON_EQUAL_PROTO(compequal_M_B);
95 DECLARE_COMPARISON_EQUAL_PROTO(compequal_B_S);
96 DECLARE_COMPARISON_EQUAL_PROTO(compequal_S_B);
97
98 DECLARE_COMPARISON_EQUAL_PROTO(compequal_LT_LT);
99
100 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MCR_MCR);
101
102 DECLARE_COMPARISON_EQUAL_PROTO(compequal_UT_UT);
103
104
105 #undef DECLARE_COMPARISON_EQUAL_PROTO
106
107 template<> types::InternalType* compequal_M_M<types::Sparse, types::Sparse, types::SparseBool>(types::Sparse* _pL, types::Sparse* _pR);
108
109 template<> types::InternalType* compequal_M_M<types::Polynom, types::Polynom, types::Bool>(types::Polynom* _pL, types::Polynom* _pR);
110
111 template<> types::InternalType* compequal_M_M<types::String, types::String, types::Bool>(types::String* _pL, types::String* _pR);
112
113 template<> types::InternalType* compequal_M_M<types::Struct, types::Struct, types::Bool>(types::Struct* _pL, types::Struct* _pR);
114
115 template<> types::InternalType* compequal_M_M<types::Cell, types::Cell, types::Bool>(types::Cell* _pL, types::Cell* _pR);
116
117 template<> types::InternalType* compequal_M_M<types::GraphicHandle, types::GraphicHandle, types::Bool>(types::GraphicHandle* _pL, types::GraphicHandle* _pR);
118
119 template<> types::InternalType* compequal_M_M<types::SparseBool, types::SparseBool, types::SparseBool>(types::SparseBool* _pL, types::SparseBool* _pR);
120 template<> types::InternalType* compequal_M_M<types::Bool, types::SparseBool, types::SparseBool>(types::Bool* _pL, types::SparseBool* _pR);
121 template<> types::InternalType* compequal_M_M<types::SparseBool, types::Bool, types::SparseBool>(types::SparseBool* _pL, types::Bool* _pR);
122
123 //x1 == x1
124 template<typename T, typename U, typename O> inline static void compequal(T l, U r, O* o)
125 {
126     *o = ((T)l == (U)r);
127 }
128
129 //X == X
130 template<typename T, typename U, typename O> inline static void compequal(T* l, size_t size, U* r, O* o)
131 {
132     for (size_t i = 0; i < size; ++i)
133     {
134         compequal((T)l[i], (U)r[i], &o[i]);
135     }
136 }
137
138 //x == X
139 template<typename T, typename U, typename O> inline static void compequal(T l, size_t size, U* r, O* o)
140 {
141     for (size_t i = 0; i < size; ++i)
142     {
143         compequal((T)l, (U)r[i], &o[i]);
144     }
145 }
146
147 //X == x
148 template<typename T, typename U, typename O> inline static void compequal(T* l, size_t size, U r, O* o)
149 {
150     for (size_t i = 0; i < size; ++i)
151     {
152         compequal((T)l[i], (U)r, &o[i]);
153     }
154 }
155
156 //x1c == x1c
157 template<typename T, typename U, typename O> inline static void compequal(T l, T lc, U r, U rc, O* o)
158 {
159     *o = (((T)l == (U)r) && ((T)lc == (U)rc));
160 }
161
162 //X1c == X1c
163 template<typename T, typename U, typename O> inline static void compequal(T* l, T* lc, size_t size, U* r, U* rc, O* o)
164 {
165     for (size_t i = 0; i < size; ++i)
166     {
167         compequal((T)l[i], (T)lc[i], (U)r[i], (U)rc[i], &o[i]);
168     }
169 }
170
171 //X1c == x1c
172 template<typename T, typename U, typename O> inline static void compequal(T* l, T* lc, size_t size, U r, U rc, O* o)
173 {
174     for (size_t i = 0; i < size; ++i)
175     {
176         compequal((T)l[i], (T)lc[i], (U)r, (U)rc, &o[i]);
177     }
178 }
179
180 //x1c == X1c
181 template<typename T, typename U, typename O> inline static void compequal(T l, T lc, size_t size, U* r, U* rc, O* o)
182 {
183     for (size_t i = 0; i < size; ++i)
184     {
185         compequal((T)l, (T)lc, (U)r[i], (U)rc[i], &o[i]);
186     }
187 }
188
189 //X1 == X1c
190 template<typename T, typename U, typename O> inline static void compequal(T* l, size_t size, U* r, U* rc, O* o)
191 {
192     for (size_t i = 0; i < size; ++i)
193     {
194         compequal((T)l[i], (T)0, (U)r[i], (U)rc[i], &o[i]);
195     }
196 }
197
198 //X1 == x1c
199 template<typename T, typename U, typename O> inline static void compequal(T* l, size_t size, U r, U rc, O* o)
200 {
201     for (size_t i = 0; i < size; ++i)
202     {
203         compequal((T)l[i], (T)0, (U)r, (U)rc, &o[i]);
204     }
205 }
206
207 //x1 == X1c
208 template<typename T, typename U, typename O> inline static void compequal(T l, size_t size, U* r, U* rc, O* o)
209 {
210     for (size_t i = 0; i < size; ++i)
211     {
212         compequal((T)l, (T)0, (U)r[i], (U)rc[i], &o[i]);
213     }
214 }
215
216 //X1c == X1
217 template<typename T, typename U, typename O> inline static void compequal(T* l, T* lc, size_t size, U* r, O* o)
218 {
219     for (size_t i = 0; i < size; ++i)
220     {
221         compequal((T)l[i], (T)lc[i], (U)r[i], (U)0, &o[i]);
222     }
223 }
224
225 //X1c == x1
226 template<typename T, typename U, typename O> inline static void compequal(T* l, T* lc, size_t size, U r, O* o)
227 {
228     for (size_t i = 0; i < size; ++i)
229     {
230         compequal((T)l[i], (T)lc[i], (U)r, (U)0, &o[i]);
231     }
232 }
233
234 //x1c == X1
235 template<typename T, typename U, typename O> inline static void compequal(T l, T lc, size_t size, U* r, O* o)
236 {
237     for (size_t i = 0; i < size; ++i)
238     {
239         compequal((T)l, (T)lc, (U)r[i], (U)0, &o[i]);
240     }
241 }
242
243 #endif /* !__TYPES_COMPARISON_EQUAL_HXX__ */