* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / operations / types_and.hxx
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
17 #ifndef __TYPES_AND_H__
18 #define __TYPES_AND_H__
19
20 #include "generic_operations.hxx"
21 #include "bool.hxx"
22 #include "sparse.hxx"
23
24 void fillAndFunction();
25
26 //define arrays on operation functions
27 typedef types::InternalType*(*and_function)(types::InternalType*, types::InternalType*);
28
29 #define DECLARE_AND_PROTO(x) \
30     template<class T, class U, class O> \
31     types::InternalType* x(T *_pL, U *_pR)
32
33 DECLARE_AND_PROTO(and_M_M);
34 DECLARE_AND_PROTO(and_M_S);
35 DECLARE_AND_PROTO(and_M_E);
36
37 DECLARE_AND_PROTO(and_S_M);
38 DECLARE_AND_PROTO(and_S_S);
39 DECLARE_AND_PROTO(and_S_E);
40
41 //[]
42 DECLARE_AND_PROTO(and_E_M);
43
44 //eye
45 DECLARE_AND_PROTO(and_I_M);
46 DECLARE_AND_PROTO(and_I_S);
47
48 DECLARE_AND_PROTO(and_int_M_M);
49 DECLARE_AND_PROTO(and_int_M_S);
50 DECLARE_AND_PROTO(and_int_S_M);
51 DECLARE_AND_PROTO(and_int_S_S);
52
53 //boolean sparse specialisation
54 template<> types::InternalType* and_E_M<types::Double, types::Bool, types::Bool>(types::Double* _pL, types::Bool* _pR);
55 template<> types::InternalType* and_M_E<types::Bool, types::Double, types::Bool>(types::Bool* _pL, types::Double* _pR);
56 template<> types::InternalType* and_M_M<types::SparseBool, types::SparseBool, types::SparseBool>(types::SparseBool* _pL, types::SparseBool* _pR);
57 template<> types::InternalType* and_M_M<types::SparseBool, types::Bool, types::SparseBool>(types::SparseBool* _pL, types::Bool* _pR);
58 template<> types::InternalType* and_M_M<types::Bool, types::SparseBool, types::SparseBool>(types::Bool* _pL, types::SparseBool* _pR);
59
60 //x & x
61 template<typename T, typename U, typename O> inline static void bit_and(T* l, long long size, U* r, O* o)
62 {
63     for (int i = 0; i < size ; ++i)
64     {
65         o[i] = (((T)l[i] != (T)0) && ((U)r[i] != (U)0)) ? (O)1 : (O)0;
66     }
67 }
68
69 //x1 & x
70 template<typename T, typename U, typename O> inline static void bit_and(T l, long long size, U* r, O* o)
71 {
72     for (int i = 0; i < size ; ++i)
73     {
74         o[i] = (((T)l != (T)0) && ((U)r[i] != (U)0)) ? (O)1 : (O)0;
75     }
76 }
77
78 //x & x1
79 template<typename T, typename U, typename O> inline static void bit_and(T* l, long long size, U r, O* o)
80 {
81     for (int i = 0; i < size ; ++i)
82     {
83         o[i] = (((T)l[i] != (T)0) && ((U)r != (U)0)) ? (O)1 : (O)0;
84     }
85 }
86
87 //x1 & x1
88 template<typename T, typename U, typename O> inline static void bit_and(T l, U r, O* o)
89 {
90     *o = (((T)l != (T)0) && ((U)r != (U)0)) ? (O)1 : (O)0;
91 }
92
93
94 //int, real & operation,
95 //x & x
96 template<typename T, typename U, typename O> inline static void int_and(T* l, long long size, U* r, O* o)
97 {
98     for (int i = 0; i < size ; ++i)
99     {
100         o[i] = (O)l[i] & (O)r[i];
101     }
102 }
103
104 //x1 & x
105 template<typename T, typename U, typename O> inline static void int_and(T l, long long size, U* r, O* o)
106 {
107     for (int i = 0; i < size ; ++i)
108     {
109         o[i] = (O)l & (O)r[i];
110     }
111 }
112
113 //x & x1
114 template<typename T, typename U, typename O> inline static void int_and(T* l, long long size, U r, O* o)
115 {
116     for (int i = 0; i < size ; ++i)
117     {
118         o[i] = (O)l[i] & (O)r;
119     }
120 }
121
122 //x1 & x1
123 template<typename T, typename U, typename O> inline static void int_and(T l, U r, O* o)
124 {
125     *o = (O)l & (O)r;
126 }
127
128 // &&
129 template<typename T>
130 void isValueFalse(T* _pL, types::Bool** _pOut);
131 template<>
132 void isValueFalse(types::Double* _pL, types::Bool** _pOut);
133 template<>
134 void isValueFalse(types::SparseBool* _pL, types::Bool** _pOut);
135 template<>
136 void isValueFalse(types::Sparse* _pL, types::Bool** _pOut);
137
138 #undef DECLARE_AND_PROTO
139 #endif /* !__TYPES_AND_H__ */
140
141