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