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