f28f3ad1422e0f374afbf56b7770f71142222a8d
[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 cloneData;
29     bool deleteData;
30     bool hasRefCount;
31     bool safe;
32
33     Decorator() : res(), opt(), cloneData(false), deleteData(false), hasRefCount(false), safe(false) { }
34
35     ~Decorator()
36     {
37     }
38
39     inline Call * getCall() const
40     {
41         return opt.get<Call>();
42     }
43
44     inline Call & setCall(Call * _call)
45     {
46         opt.set(_call);
47         return *_call;
48     }
49
50     inline Call & setCall(const std::wstring & name)
51     {
52         Call * call = new Call(name);
53         opt.set(call);
54         return *call;
55     }
56
57     inline Call & setCall(const std::wstring & name, const std::vector<TIType> & args)
58     {
59         Call * call = new Call(name, args);
60         opt.set(call);
61         return *call;
62     }
63
64     inline Call & setCall(const std::wstring & name, const TIType & arg)
65     {
66         Call * call = new Call(name, arg);
67         opt.set(call);
68         return *call;
69     }
70
71     inline Clone * getClone() const
72     {
73         return opt.get<Clone>();
74     }
75
76     inline Clone & setClone(Clone * _clone)
77     {
78         opt.set(_clone);
79         return *_clone;
80     }
81
82     inline Clone & addClone(const symbol::Symbol & sym)
83     {
84         Clone * clone = opt.get<Clone>();
85         if (clone)
86         {
87             clone->add(sym);
88         }
89         else
90         {
91             clone = new Clone(sym);
92             opt.set(clone);
93         }
94         return *clone;
95     }
96
97     inline Result & setResult(Result && _res)
98     {
99         res = _res;
100         return res;
101     }
102
103     inline Result & setResult(Result & _res)
104     {
105         res = _res;
106         return res;
107     }
108
109     inline const Result & getResult() const
110     {
111         return res;
112     }
113
114     inline Result & getResult()
115     {
116         return res;
117     }
118
119     friend std::wostream & operator<<(std::wostream & out, const Decorator & deco)
120     {
121         out << deco.res;
122         if (!deco.opt.empty())
123         {
124             out << L", " << deco.opt;
125         }
126         out << L", Cl:" << (deco.cloneData ? L"T" : L"F")
127             << L", Del:" << (deco.deleteData ? L"T" : L"F")
128             << L", RefC:" << (deco.hasRefCount ? L"T" : L"F")
129             << L", Safe:" << (deco.safe ? L"T" : L"F");
130
131         return out;
132     }
133 };
134
135 } // namespace analysis
136
137 #endif // __DECORATOR_HXX__