Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / Decorator.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 #ifndef __DECORATOR_HXX__
14 #define __DECORATOR_HXX__
15
16 #include "Result.hxx"
17 #include "OptionalDecoration.hxx"
18
19 #include <iostream>
20
21 namespace analysis
22 {
23
24 struct Decorator
25 {
26     Result res;
27     OptionalDecoration opt;
28     bool deleteData;
29     bool safe;
30
31     Decorator() : res(), opt(), deleteData(false), safe(false) { }
32
33     ~Decorator()
34     {
35     }
36
37     inline Call * getCall() const
38     {
39         return opt.get<Call>();
40     }
41
42     inline Call & setCall(Call * _call)
43     {
44         opt.set(_call);
45         return *_call;
46     }
47
48     inline Call & setCall(const std::wstring & name)
49     {
50         Call * call = new Call(name);
51         opt.set(call);
52         return *call;
53     }
54
55     inline Call & setCall(const std::wstring & name, const std::vector<TIType> & args)
56     {
57         Call * call = new Call(name, args);
58         opt.set(call);
59         return *call;
60     }
61
62     inline Call & setCall(const std::wstring & name, const TIType & arg)
63     {
64         Call * call = new Call(name, arg);
65         opt.set(call);
66         return *call;
67     }
68
69     inline Clone * getClone() const
70     {
71         return opt.get<Clone>();
72     }
73
74     inline Clone & setClone(Clone * _clone)
75     {
76         opt.set(_clone);
77         return *_clone;
78     }
79
80     inline Clone & addClone(const symbol::Symbol & sym)
81     {
82         Clone * clone = opt.get<Clone>();
83         if (clone)
84         {
85             clone->add(sym);
86         }
87         else
88         {
89             clone = new Clone(sym);
90             opt.set(clone);
91         }
92         return *clone;
93     }
94
95     inline Result & setResult(Result && _res)
96     {
97         res = _res;
98         return res;
99     }
100
101     inline Result & setResult(Result & _res)
102     {
103         res = _res;
104         return res;
105     }
106
107     inline const Result & getResult() const
108     {
109         return res;
110     }
111
112     inline Result & getResult()
113     {
114         return res;
115     }
116
117     friend std::wostream & operator<<(std::wostream & out, const Decorator & deco)
118     {
119         out << deco.res;
120         if (!deco.opt.empty())
121         {
122             out << L", " << deco.opt;
123         }
124         if (deco.deleteData)
125         {
126             out << L", Del: T";
127         }
128         if (deco.safe)
129         {
130             out << L", Safe: T";
131         }
132
133         return out;
134     }
135 };
136
137 } // namespace analysis
138
139 #endif // __DECORATOR_HXX__