0cf80695642e5d5858c5f164b74ef6ecc3660817
[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 "DollarInfo.hxx"
21
22 namespace analysis
23 {
24
25 class OptionalDecoration
26 {
27     enum Type { NONE, CALL, CLONE, DOLLAR };
28
29     Type ty;
30     void * ptr;
31
32 public:
33
34     OptionalDecoration() : ty(NONE), ptr(nullptr) { }
35     OptionalDecoration(Call * _ptr) : ty(CALL), ptr(_ptr) { }
36     OptionalDecoration(Clone * _ptr) : ty(CLONE), ptr(_ptr) { }
37     OptionalDecoration(DollarInfo * _ptr) : ty(DOLLAR), ptr(_ptr) { }
38     OptionalDecoration(OptionalDecoration && od) : ty(od.ty), ptr(od.ptr)
39     {
40         od.ty = NONE;
41         od.ptr = nullptr;
42     }
43
44     OptionalDecoration(const OptionalDecoration & od) = delete;
45
46     ~OptionalDecoration()
47     {
48         clean();
49     }
50
51     inline bool empty() const
52     {
53         return ty == NONE;
54     }
55
56     template<typename T>
57     inline T * get() const
58     {
59         return static_cast<T *>(ptr);
60     }
61
62     inline void set(Call * _ptr)
63     {
64         clean();
65         ty = CALL;
66         ptr = _ptr;
67     }
68
69     inline void set(Clone * _ptr)
70     {
71         clean();
72         ty = CLONE;
73         ptr = _ptr;
74     }
75
76     inline void set(DollarInfo * _ptr)
77     {
78         clean();
79         ty = DOLLAR;
80         ptr = _ptr;
81     }
82
83     friend std::wostream & operator<<(std::wostream & out, const OptionalDecoration & od)
84     {
85         switch (od.ty)
86         {
87             case CALL:
88                 out << *od.get<Call>();
89                 break;
90             case CLONE:
91                 out << *od.get<Clone>();
92                 break;
93             case DOLLAR:
94                 out << *od.get<DollarInfo>();
95                 break;
96             default:
97                 break;
98         }
99
100         return out;
101     }
102
103 private:
104
105     inline void clean()
106     {
107         switch (ty)
108         {
109             case CALL:
110                 delete get<Call>();
111                 break;
112             case CLONE:
113                 delete get<Clone>();
114                 break;
115             case DOLLAR:
116                 delete get<DollarInfo>();
117                 break;
118             default:
119                 break;
120         }
121     }
122
123 };
124
125 } // namespace analysis
126
127 #endif // __OPTIONAL_DECORATION_HXX__