Update CHANGES.md before the release
[scilab.git] / scilab / modules / ast / includes / exps / memfillexp.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 __MEMFILL_EXP_HXX__
17 #define __MEMFILL_EXP_HXX__
18
19 namespace ast
20 {
21 /**
22  * \class MemfillExp
23  * \brief represent an exp like zeros or ones or anything else...
24  *
25  * The expression %pi+zeros(...) is equivalent to fill the matrix with %pi and obviously
26  * it is fastest to fill with %pi rather than to fill with zero and then add %pi.
27  * This expression comes from an analysis of such expressions.
28  *
29  */
30 class MemfillExp : public OptimizedExp
31 {
32
33 public:
34
35     MemfillExp(const Location & location, Exp & value, const exps_t & args) : OptimizedExp(location)
36     {
37         _exps.push_back(&value);
38         value.setParent(this);
39         for (auto arg : args)
40         {
41             _exps.push_back(arg);
42             arg->setParent(this);
43         }
44     }
45
46     virtual ~MemfillExp()
47     {
48     }
49
50     virtual MemfillExp * clone() override
51     {
52         exps_t args;
53         args.reserve(_exps.size() - 1);
54         for (exps_t::iterator i = std::next(_exps.begin()), end = _exps.end(); i != end; ++i)
55         {
56             args.emplace_back((*i)->clone());
57         }
58         return new MemfillExp(getLocation(), *getValue().clone(), args);
59     }
60
61     virtual void accept(Visitor& v) override
62     {
63         v.visit(*this);
64     }
65
66     virtual void accept(ConstVisitor& v) const override
67     {
68         v.visit(*this);
69     }
70
71     const Exp & getValue() const
72     {
73         return *_exps[0];
74     }
75
76     Exp & getValue()
77     {
78         return *_exps[0];
79     }
80
81     exps_t getArgs() const
82     {
83         return exps_t(std::next(_exps.begin()), _exps.end());
84     }
85
86     exps_t getArgs()
87     {
88         return exps_t(std::next(_exps.begin()), _exps.end());
89     }
90
91     inline bool isMemfillExp() const override
92     {
93         return true;
94     }
95
96     virtual ExpType getType() const override
97     {
98         return MEMFILLEXP;
99     }
100 };
101
102 } // namespace ast
103
104 #endif // __MEMFILL_EXP_HXX__