fix library path
[scilab.git] / scilab / modules / ast / includes / analysis / SymInfo.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 __SYMINFO_HXX__
14 #define __SYMINFO_HXX__
15
16 #include <iostream>
17
18 namespace analysis
19 {
20 struct SymInfo
21 {
22     enum Kind { WRITE, READ, REPLACE, FOR_IT };
23
24     bool write;
25     bool read;
26     bool replace;
27     bool for_it;
28     TIType current_type;
29
30     SymInfo() : write(false), read(false), replace(false), for_it(false) { }
31     SymInfo(Kind k) : write(k == WRITE), read(k == READ), replace(k == REPLACE), for_it(k == FOR_IT) { }
32     SymInfo(Kind k1, Kind k2) : write(k1 == WRITE || k2 == WRITE),
33         read(k1 == READ || k2 == READ),
34         replace(k1 == REPLACE || k2 == REPLACE),
35         for_it(k1 == FOR_IT || k2 == FOR_IT) { }
36
37     inline void set(Kind k)
38     {
39         switch (k)
40         {
41             case WRITE:
42                 if (!write)
43                 {
44                     write = true;
45                 }
46                 break;
47             case READ:
48                 if (!read)
49                 {
50                     read = true;
51                 }
52                 break;
53             case REPLACE:
54                 if (!replace)
55                 {
56                     replace = true;
57                 }
58                 break;
59             case FOR_IT:
60                 if (!for_it)
61                 {
62                     for_it = true;
63                 }
64                 break;
65         }
66     }
67
68     inline void set(Kind k1, Kind k2)
69     {
70         set(k1);
71         set(k2);
72     }
73
74     inline bool isJustRead() const
75     {
76         return !write && !replace && read;
77     }
78
79     friend std::wostream & operator<<(std::wostream & out, const SymInfo & si)
80     {
81         out << L"Symbol use { w: " << (si.write ? L'T' : L'F')
82             << L", rd: " << (si.read ? L'T' : L'F')
83             << L", rp: " << (si.replace ? L'T' : L'F')
84             << L", fi: " << (si.for_it ? L'T' : L'F')
85             << L"}, type " << si.current_type;
86         return out;
87     }
88 };
89
90 } // namespace analysis
91
92 #endif // __SYMINFO_HXX__