Analysis: Add DollarInfo, VarPromotion, and move var clone at the right place when...
[scilab.git] / scilab / modules / ast / includes / analysis / OptionalDecoration.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - 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 __OPTIONAL_DECORATION_HXX__
14 #define __OPTIONAL_DECORATION_HXX__
15
16 #include <iostream>
17
18 #include "call/Call.hxx"
19 #include "data/Clone.hxx"
20 #include "data/LoopDecoration.hxx"
21 #include "DollarInfo.hxx"
22
23 namespace analysis
24 {
25
26 class OptionalDecoration
27 {
28     enum Type { NONE, CALL, LOOP, DOLLAR };
29
30     Type ty;
31     void * ptr;
32
33 public:
34
35     OptionalDecoration() : ty(NONE), ptr(nullptr) { }
36     OptionalDecoration(Call * _ptr) : ty(CALL), ptr(_ptr) { }
37     OptionalDecoration(LoopDecoration * _ptr) : ty(LOOP), ptr(_ptr) { }
38     OptionalDecoration(DollarInfo * _ptr) : ty(DOLLAR), ptr(_ptr) { }
39     OptionalDecoration(OptionalDecoration && od) : ty(od.ty), ptr(od.ptr)
40     {
41         od.ty = NONE;
42         od.ptr = nullptr;
43     }
44
45     OptionalDecoration(const OptionalDecoration & od) = delete;
46
47     ~OptionalDecoration()
48     {
49         clean();
50     }
51
52     inline bool empty() const
53     {
54         return ty == NONE;
55     }
56
57     template<typename T>
58     inline T * get() const
59     {
60         return static_cast<T *>(ptr);
61     }
62
63     inline void set(Call * _ptr)
64     {
65         clean();
66         ty = CALL;
67         ptr = _ptr;
68     }
69
70     inline void set(LoopDecoration * _ptr)
71     {
72         clean();
73         ty = LOOP;
74         ptr = _ptr;
75     }
76
77     inline void set(DollarInfo * _ptr)
78     {
79         clean();
80         ty = DOLLAR;
81         ptr = _ptr;
82     }
83
84     friend std::wostream & operator<<(std::wostream & out, const OptionalDecoration & od)
85     {
86         switch (od.ty)
87         {
88             case CALL:
89                 out << *od.get<Call>();
90                 break;
91             case LOOP:
92                 out << *od.get<LoopDecoration>();
93                 break;
94             case DOLLAR:
95                 out << *od.get<DollarInfo>();
96                 break;
97             default:
98                 break;
99         }
100
101         return out;
102     }
103
104 private:
105
106     inline void clean()
107     {
108         switch (ty)
109         {
110             case CALL:
111                 delete get<Call>();
112                 break;
113             case LOOP:
114                 delete get<LoopDecoration>();
115                 break;
116             case DOLLAR:
117                 delete get<DollarInfo>();
118                 break;
119             default:
120                 break;
121         }
122     }
123
124 };
125
126 } // namespace analysis
127
128 #endif // __OPTIONAL_DECORATION_HXX__