fix ast memory leak in tests
[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
89         {
90             return nargs == R.nargs && name == R.name;
91         }
92     };
93
94     struct __Infos
95     {
96         const unsigned short pos;
97         const bool elementwise;
98         const bool notconst;
99         const bool jitted;
100
101         __Infos(const unsigned short _pos, const bool _ew, const bool _nc, const bool _j) : pos(_pos), elementwise(_ew), notconst(_nc), jitted(_j) { }
102     };
103
104     struct __Hasher
105     {
106         inline std::size_t operator()(const __NName & nn) const
107         {
108             return (std::hash<std::wstring>()(nn.name) << 4) ^ nn.nargs;
109         }
110     };
111
112     typedef std::unordered_map<__NName, __Infos, __Hasher> CheckersMap;
113     static CheckersMap map;
114     static TIType (*ARGS0[3])(GVN &);
115     static TIType (*ARGS1[40])(GVN &, const TIType &);
116     static TIType (*ARGS2[5])(GVN &, const TIType &, const TIType &);
117
118 public:
119
120     static TIType check(GVN & gvn, const std::wstring & name, const std::vector<TIType> & args)
121     {
122         const unsigned short size = static_cast<unsigned short>(args.size());
123         CheckersMap::const_iterator i = map.find(__NName(size, name));
124         if (i != map.end())
125         {
126             // TODO : remove array of function pointers and replace by a switch statement
127             switch (size)
128             {
129                 case 0:
130                     return ARGS0[i->second.pos](gvn);
131                 case 1:
132                     return ARGS1[i->second.pos](gvn, args[0]);
133                 case 2:
134                     return ARGS2[i->second.pos](gvn, args[0], args[1]);
135             }
136         }
137
138         return TIType(gvn);
139     }
140
141     static bool isElementWise(const std::wstring & name, unsigned short nargs = 1)
142     {
143         CheckersMap::const_iterator i = map.find(__NName(nargs, name));
144         if (i != map.end())
145         {
146             return i->second.elementwise;
147         }
148         return false;
149     }
150
151     static bool isJitted(const std::wstring & name, unsigned short nargs = 1)
152     {
153         CheckersMap::const_iterator i = map.find(__NName(nargs, name));
154         if (i != map.end())
155         {
156             return i->second.jitted;
157         }
158         return false;
159     }
160
161 private:
162
163     static CheckersMap initMap()
164     {
165         CheckersMap map;
166         map.emplace(__NName(0, L"rand"), __Infos(0, false, true, false));
167         map.emplace(__NName(0, L"zeros"), __Infos(1, false, false, false));
168         map.emplace(__NName(0, L"ones"), __Infos(2, false, false, false));
169         map.emplace(__NName(1, L"rand"), __Infos(0, false, true, false));
170         map.emplace(__NName(1, L"int"), __Infos(1, true, false, true));
171         map.emplace(__NName(1, L"cosh"), __Infos(2, true, false, true));
172         map.emplace(__NName(1, L"tan"), __Infos(3, true, false, true));
173         map.emplace(__NName(1, L"cumsum"), __Infos(4, true, false, true));
174         map.emplace(__NName(1, L"asin"), __Infos(5, true, false, false));
175         map.emplace(__NName(1, L"isnan"), __Infos(6, true, false, true));
176         map.emplace(__NName(1, L"floor"), __Infos(7, true, false, true));
177         map.emplace(__NName(1, L"fix"), __Infos(8, true, false, true));
178         map.emplace(__NName(1, L"sqrt"), __Infos(9, true, false, true));
179         map.emplace(__NName(1, L"uint16"), __Infos(10, true, false, true));
180         map.emplace(__NName(1, L"abs"), __Infos(11, true, false, true));
181         map.emplace(__NName(1, L"zeros"), __Infos(12, false, false, false));
182         map.emplace(__NName(1, L"max"), __Infos(13, false, false, true));
183         map.emplace(__NName(1, L"uint32"), __Infos(14, true, false, true));
184         map.emplace(__NName(1, L"int64"), __Infos(15, true, false, true));
185         map.emplace(__NName(1, L"prod"), __Infos(16, false, false, true));
186         map.emplace(__NName(1, L"sin"), __Infos(17, true, false, true));
187         map.emplace(__NName(1, L"int32"), __Infos(18, true, false, true));
188         map.emplace(__NName(1, L"int16"), __Infos(19, true, false, true));
189         map.emplace(__NName(1, L"exp"), __Infos(20, true, false, true));
190         map.emplace(__NName(1, L"atan"), __Infos(21, true, false, false));
191         map.emplace(__NName(1, L"uint8"), __Infos(22, true, false, true));
192         map.emplace(__NName(1, L"ceil"), __Infos(23, true, false, true));
193         map.emplace(__NName(1, L"sinm"), __Infos(24, false, false, false));
194         map.emplace(__NName(1, L"isinf"), __Infos(25, true, false, true));
195         map.emplace(__NName(1, L"sinh"), __Infos(26, true, false, true));
196         map.emplace(__NName(1, L"int8"), __Infos(27, true, false, true));
197         map.emplace(__NName(1, L"log"), __Infos(28, true, false, false));
198         map.emplace(__NName(1, L"uint64"), __Infos(29, true, false, true));
199         map.emplace(__NName(1, L"cos"), __Infos(30, true, false, true));
200         map.emplace(__NName(1, L"tanh"), __Infos(31, true, false, true));
201         map.emplace(__NName(1, L"min"), __Infos(32, false, false, true));
202         map.emplace(__NName(1, L"cumprod"), __Infos(33, true, false, true));
203         map.emplace(__NName(1, L"erf"), __Infos(34, true, false, true));
204         map.emplace(__NName(1, L"ones"), __Infos(35, false, false, false));
205         map.emplace(__NName(1, L"erfc"), __Infos(36, true, false, true));
206         map.emplace(__NName(1, L"sum"), __Infos(37, false, false, true));
207         map.emplace(__NName(1, L"acos"), __Infos(38, true, false, false));
208         map.emplace(__NName(1, L"round"), __Infos(39, true, false, true));
209         map.emplace(__NName(2, L"rand"), __Infos(0, false, true, false));
210         map.emplace(__NName(2, L"dothypot"), __Infos(1, true, false, true));
211         map.emplace(__NName(2, L"hypot"), __Infos(2, false, false, true));
212         map.emplace(__NName(2, L"zeros"), __Infos(3, false, false, false));
213         map.emplace(__NName(2, L"ones"), __Infos(4, false, false, false));
214         ARGS0[0] = &check_rand;
215         ARGS0[1] = &check_zeros;
216         ARGS0[2] = &check_ones;
217         ARGS1[0] = &check_rand;
218         ARGS1[1] = &check_int;
219         ARGS1[2] = &check_cosh;
220         ARGS1[3] = &check_tan;
221         ARGS1[4] = &check_cumsum;
222         ARGS1[5] = &check_asin;
223         ARGS1[6] = &check_isnan;
224         ARGS1[7] = &check_floor;
225         ARGS1[8] = &check_fix;
226         ARGS1[9] = &check_sqrt;
227         ARGS1[10] = &check_uint16;
228         ARGS1[11] = &check_abs;
229         ARGS1[12] = &check_zeros;
230         ARGS1[13] = &check_max;
231         ARGS1[14] = &check_uint32;
232         ARGS1[15] = &check_int64;
233         ARGS1[16] = &check_prod;
234         ARGS1[17] = &check_sin;
235         ARGS1[18] = &check_int32;
236         ARGS1[19] = &check_int16;
237         ARGS1[20] = &check_exp;
238         ARGS1[21] = &check_atan;
239         ARGS1[22] = &check_uint8;
240         ARGS1[23] = &check_ceil;
241         ARGS1[24] = &check_sinm;
242         ARGS1[25] = &check_isinf;
243         ARGS1[26] = &check_sinh;
244         ARGS1[27] = &check_int8;
245         ARGS1[28] = &check_log;
246         ARGS1[29] = &check_uint64;
247         ARGS1[30] = &check_cos;
248         ARGS1[31] = &check_tanh;
249         ARGS1[32] = &check_min;
250         ARGS1[33] = &check_cumprod;
251         ARGS1[34] = &check_erf;
252         ARGS1[35] = &check_ones;
253         ARGS1[36] = &check_erfc;
254         ARGS1[37] = &check_sum;
255         ARGS1[38] = &check_acos;
256         ARGS1[39] = &check_round;
257         ARGS2[0] = &check_rand;
258         ARGS2[1] = &check_dothypot;
259         ARGS2[2] = &check_hypot;
260         ARGS2[3] = &check_zeros;
261         ARGS2[4] = &check_ones;
262
263         return map;
264     }
265 };
266
267 } // namespace analysis
268
269 #endif // __CHECKERS_HXX__