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