License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / includes / exps / tableintselectexp.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __TABLE_INT_SELECT_EXP_HXX__
17 #define __TABLE_INT_SELECT_EXP_HXX__
18
19 #include <vector>
20
21 #include "internal.hxx"
22
23 namespace ast
24 {
25 class TableIntSelectExp : public IntSelectExp
26 {
27
28 public:
29
30     TableIntSelectExp(const Location& location,
31                       Exp& select,
32                       exps_t& cases,
33                       Exp& defaultCase,
34                       const std::vector<int64_t> & _keys, const int64_t min, const int64_t max) : IntSelectExp(location, select, cases, defaultCase), _min(min), _max(max), table(_max - _min + 1, &defaultCase), keys(_keys)
35     {
36         exps_t::iterator i = std::next(_exps.begin());
37         for (const auto & key : keys)
38         {
39             table[key - _min] = *i;
40             ++i;
41         }
42     }
43
44     TableIntSelectExp(const Location& location,
45                       Exp& select,
46                       exps_t& cases,
47                       const std::vector<int64_t> & _keys, const int64_t min, const int64_t max) : IntSelectExp(location, select, cases), _min(min), _max(max), table(_max - _min + 1, nullptr), keys(_keys)
48     {
49         exps_t::iterator i = std::next(_exps.begin());
50         for (const auto & key : keys)
51         {
52             table[key - _min] = *i;
53             ++i;
54         }
55     }
56
57     virtual ~TableIntSelectExp()
58     {
59     }
60
61     virtual TableIntSelectExp * clone()
62     {
63         exps_t * cases = cloneCases();
64         TableIntSelectExp * cloned = nullptr;
65         if (_hasDefault)
66         {
67             cloned = new TableIntSelectExp(getLocation(), *getSelect()->clone(), *cases, *getDefaultCase()->clone(), keys, _min, _max);
68         }
69         else
70         {
71             cloned = new TableIntSelectExp(getLocation(), *getSelect()->clone(), *cases, keys, _min, _max);
72         }
73
74         cloned->setVerbose(isVerbose());
75         return cloned;
76     }
77
78     inline Exp * getExp(const int64_t key) const
79     {
80         if (key >= _min && key <= _max)
81         {
82             return table[key - _min];
83         }
84
85         return getDefaultCase();
86     }
87
88     inline bool isTableIntSelectExp() const
89     {
90         return true;
91     }
92
93     virtual ExpType getType() const
94     {
95         return TABLEINTSELECTEXP;
96     }
97
98     inline int64_t getMin() const
99     {
100         return _min;
101     }
102
103     inline int64_t getMax() const
104     {
105         return _max;
106     }
107
108     inline const std::vector<Exp *> & getTable() const
109     {
110         return table;
111     }
112
113 private:
114
115     int64_t _min, _max;
116     std::vector<Exp *> table;
117     std::vector<int64_t> keys;
118
119 };
120
121 } // namespace ast
122
123 #endif // __TABLE_INT_SELECT_EXP_HXX__