073f769f06ddf21ede0d8cd6dff72a31af74d1ad
[scilab.git] / scilab / modules / ast / includes / analysis / checkers / Checkers.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
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 // This file has been generated, so don't modify it by hand !!
14
15 #ifndef __CHECKERS_HXX__
16 #define __CHECKERS_HXX__
17
18 #include <cstddef>
19 #include <functional>
20 #include <string>
21 #include <unordered_map>
22 #include <vector>
23
24 #include "TIType.hxx"
25
26 #include "check_rand.hxx"
27 #include "check_int.hxx"
28 #include "check_transp.hxx"
29 #include "check_dothypot.hxx"
30 #include "check_cosh.hxx"
31 #include "check_hypot.hxx"
32 #include "check_tan.hxx"
33 #include "check_cumsum.hxx"
34 #include "check_asin.hxx"
35 #include "check_isnan.hxx"
36 #include "check_sub.hxx"
37 #include "check_floor.hxx"
38 #include "check_dottimes.hxx"
39 #include "check_fix.hxx"
40 #include "check_sqrt.hxx"
41 #include "check_uint16.hxx"
42 #include "check_add.hxx"
43 #include "check_abs.hxx"
44 #include "check_zeros.hxx"
45 #include "check_max.hxx"
46 #include "check_uint32.hxx"
47 #include "check_int64.hxx"
48 #include "check_prod.hxx"
49 #include "check_sin.hxx"
50 #include "check_krontimes.hxx"
51 #include "check_int32.hxx"
52 #include "check_dottransp.hxx"
53 #include "check_int16.hxx"
54 #include "check_exp.hxx"
55 #include "check_atan.hxx"
56 #include "check_dotrdiv.hxx"
57 #include "check_uint8.hxx"
58 #include "check_ceil.hxx"
59 #include "check_sinm.hxx"
60 #include "check_isinf.hxx"
61 #include "check_sinh.hxx"
62 #include "check_int8.hxx"
63 #include "check_log.hxx"
64 #include "check_uint64.hxx"
65 #include "check_cos.hxx"
66 #include "check_tanh.hxx"
67 #include "check_min.hxx"
68 #include "check_times.hxx"
69 #include "check_cumprod.hxx"
70 #include "check_erf.hxx"
71 #include "check_ones.hxx"
72 #include "check_erfc.hxx"
73 #include "check_sum.hxx"
74 #include "check_acos.hxx"
75 #include "check_round.hxx"
76
77 namespace analysis
78 {
79     class Checkers
80     {
81         struct __NName
82         {
83             const unsigned short nargs;
84             const std::wstring name;
85
86             //__NName(unsigned short n, const char * _name) : nargs(n), name(_name) { }
87             __NName(unsigned short n, const std::wstring & _name) : nargs(n), name(_name) { }
88             inline bool operator==(const __NName & R) const { return nargs == R.nargs && name == R.name; }
89         };
90
91         struct __Infos
92         {
93             const unsigned short pos;
94             const bool elementwise;
95             const bool notconst;
96             const bool jitted;
97
98             __Infos(const unsigned short _pos, const bool _ew, const bool _nc, const bool _j) : pos(_pos), elementwise(_ew), notconst(_nc), jitted(_j) { }
99         };
100
101         struct __Hasher
102         {
103             inline std::size_t operator()(const __NName & nn) const { return (std::hash<std::wstring>()(nn.name) << 4) ^ nn.nargs; }
104         };
105
106         typedef std::unordered_map<__NName, __Infos, __Hasher> CheckersMap;
107         static CheckersMap map;
108         static TIType (*ARGS0[3])(GVN &);
109         static TIType (*ARGS1[40])(GVN &, const TIType &);
110         static TIType (*ARGS2[5])(GVN &, const TIType &, const TIType &);
111
112     public:
113         
114         static TIType check(GVN & gvn, const std::wstring & name, const std::vector<TIType> & args)
115         {
116             const unsigned short size = args.size();
117             CheckersMap::const_iterator i = map.find(__NName(size, name));
118             if (i != map.end())
119             {
120                 // TODO : remove array of function pointers and replace by a switch statement
121                 switch (size)
122                 {
123                 case 0:
124                      return ARGS0[i->second.pos](gvn);
125                 case 1:
126                      return ARGS1[i->second.pos](gvn, args[0]);
127                 case 2:
128                      return ARGS2[i->second.pos](gvn, args[0], args[1]);
129                 }
130             }
131             
132             return TIType(gvn);
133         }
134
135         static bool isElementWise(const std::wstring & name, unsigned short nargs = 1)
136         {
137             CheckersMap::const_iterator i = map.find(__NName(nargs, name));
138             if (i != map.end())
139             {
140                 return i->second.elementwise;
141             }
142             return false;
143         }
144
145         static bool isJitted(const std::wstring & name, unsigned short nargs = 1)
146         {
147             CheckersMap::const_iterator i = map.find(__NName(nargs, name));
148             if (i != map.end())
149             {
150                 return i->second.jitted;
151             }
152             return false;
153         }
154
155     private:
156
157         static CheckersMap initMap()
158         {
159             CheckersMap map;
160             map.emplace(__NName(0, L"rand"), __Infos(0, false, true, false));
161             map.emplace(__NName(0, L"zeros"), __Infos(1, false, false, false));
162             map.emplace(__NName(0, L"ones"), __Infos(2, false, false, false));
163             map.emplace(__NName(1, L"rand"), __Infos(0, false, true, false));
164             map.emplace(__NName(1, L"int"), __Infos(1, true, false, true));
165             map.emplace(__NName(1, L"cosh"), __Infos(2, true, false, true));
166             map.emplace(__NName(1, L"tan"), __Infos(3, true, false, true));
167             map.emplace(__NName(1, L"cumsum"), __Infos(4, true, false, true));
168             map.emplace(__NName(1, L"asin"), __Infos(5, true, false, false));
169             map.emplace(__NName(1, L"isnan"), __Infos(6, true, false, true));
170             map.emplace(__NName(1, L"floor"), __Infos(7, true, false, true));
171             map.emplace(__NName(1, L"fix"), __Infos(8, true, false, true));
172             map.emplace(__NName(1, L"sqrt"), __Infos(9, true, false, true));
173             map.emplace(__NName(1, L"uint16"), __Infos(10, true, false, true));
174             map.emplace(__NName(1, L"abs"), __Infos(11, true, false, true));
175             map.emplace(__NName(1, L"zeros"), __Infos(12, false, false, false));
176             map.emplace(__NName(1, L"max"), __Infos(13, false, false, true));
177             map.emplace(__NName(1, L"uint32"), __Infos(14, true, false, true));
178             map.emplace(__NName(1, L"int64"), __Infos(15, true, false, true));
179             map.emplace(__NName(1, L"prod"), __Infos(16, false, false, true));
180             map.emplace(__NName(1, L"sin"), __Infos(17, true, false, true));
181             map.emplace(__NName(1, L"int32"), __Infos(18, true, false, true));
182             map.emplace(__NName(1, L"int16"), __Infos(19, true, false, true));
183             map.emplace(__NName(1, L"exp"), __Infos(20, true, false, true));
184             map.emplace(__NName(1, L"atan"), __Infos(21, true, false, false));
185             map.emplace(__NName(1, L"uint8"), __Infos(22, true, false, true));
186             map.emplace(__NName(1, L"ceil"), __Infos(23, true, false, true));
187             map.emplace(__NName(1, L"sinm"), __Infos(24, false, false, false));
188             map.emplace(__NName(1, L"isinf"), __Infos(25, true, false, true));
189             map.emplace(__NName(1, L"sinh"), __Infos(26, true, false, true));
190             map.emplace(__NName(1, L"int8"), __Infos(27, true, false, true));
191             map.emplace(__NName(1, L"log"), __Infos(28, true, false, false));
192             map.emplace(__NName(1, L"uint64"), __Infos(29, true, false, true));
193             map.emplace(__NName(1, L"cos"), __Infos(30, true, false, true));
194             map.emplace(__NName(1, L"tanh"), __Infos(31, true, false, true));
195             map.emplace(__NName(1, L"min"), __Infos(32, false, false, true));
196             map.emplace(__NName(1, L"cumprod"), __Infos(33, true, false, true));
197             map.emplace(__NName(1, L"erf"), __Infos(34, true, false, true));
198             map.emplace(__NName(1, L"ones"), __Infos(35, false, false, false));
199             map.emplace(__NName(1, L"erfc"), __Infos(36, true, false, true));
200             map.emplace(__NName(1, L"sum"), __Infos(37, false, false, true));
201             map.emplace(__NName(1, L"acos"), __Infos(38, true, false, false));
202             map.emplace(__NName(1, L"round"), __Infos(39, true, false, true));
203             map.emplace(__NName(2, L"rand"), __Infos(0, false, true, false));
204             map.emplace(__NName(2, L"dothypot"), __Infos(1, true, false, true));
205             map.emplace(__NName(2, L"hypot"), __Infos(2, false, false, true));
206             map.emplace(__NName(2, L"zeros"), __Infos(3, false, false, false));
207             map.emplace(__NName(2, L"ones"), __Infos(4, false, false, false));           
208             ARGS0[0] = &check_rand;
209             ARGS0[1] = &check_zeros;
210             ARGS0[2] = &check_ones;
211             ARGS1[0] = &check_rand;
212             ARGS1[1] = &check_int;
213             ARGS1[2] = &check_cosh;
214             ARGS1[3] = &check_tan;
215             ARGS1[4] = &check_cumsum;
216             ARGS1[5] = &check_asin;
217             ARGS1[6] = &check_isnan;
218             ARGS1[7] = &check_floor;
219             ARGS1[8] = &check_fix;
220             ARGS1[9] = &check_sqrt;
221             ARGS1[10] = &check_uint16;
222             ARGS1[11] = &check_abs;
223             ARGS1[12] = &check_zeros;
224             ARGS1[13] = &check_max;
225             ARGS1[14] = &check_uint32;
226             ARGS1[15] = &check_int64;
227             ARGS1[16] = &check_prod;
228             ARGS1[17] = &check_sin;
229             ARGS1[18] = &check_int32;
230             ARGS1[19] = &check_int16;
231             ARGS1[20] = &check_exp;
232             ARGS1[21] = &check_atan;
233             ARGS1[22] = &check_uint8;
234             ARGS1[23] = &check_ceil;
235             ARGS1[24] = &check_sinm;
236             ARGS1[25] = &check_isinf;
237             ARGS1[26] = &check_sinh;
238             ARGS1[27] = &check_int8;
239             ARGS1[28] = &check_log;
240             ARGS1[29] = &check_uint64;
241             ARGS1[30] = &check_cos;
242             ARGS1[31] = &check_tanh;
243             ARGS1[32] = &check_min;
244             ARGS1[33] = &check_cumprod;
245             ARGS1[34] = &check_erf;
246             ARGS1[35] = &check_ones;
247             ARGS1[36] = &check_erfc;
248             ARGS1[37] = &check_sum;
249             ARGS1[38] = &check_acos;
250             ARGS1[39] = &check_round;
251             ARGS2[0] = &check_rand;
252             ARGS2[1] = &check_dothypot;
253             ARGS2[2] = &check_hypot;
254             ARGS2[3] = &check_zeros;
255             ARGS2[4] = &check_ones;
256
257             return map;
258         }
259     };
260
261 } // namespace analysis
262
263 #endif // __CHECKERS_HXX__