Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / src / cpp / analysis / Data.cpp
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 #include "tools.hxx"
14 #include "data/Data.hxx"
15
16 namespace analysis
17 {
18
19 Data::Data(const bool _known, const symbol::Symbol & sym) : known(_known), valid(true), sharedSyms()
20 {
21     sharedSyms.emplace(sym);
22 }
23
24 void Data::clear()
25 {
26     valid = true;
27     sharedSyms.clear();
28 }
29
30 void Data::add(const symbol::Symbol & sym)
31 {
32     if (valid)
33     {
34         sharedSyms.emplace(sym);
35     }
36 }
37
38 void Data::rem(const symbol::Symbol & sym)
39 {
40     if (valid)
41     {
42         sharedSyms.erase(sym);
43     }
44 }
45
46 bool Data::hasOneOwner() const
47 {
48     return valid && known && (sharedSyms.size() == 1);
49 }
50
51 bool Data::isDeletable() const
52 {
53     return valid && known && sharedSyms.empty();
54 }
55
56 bool Data::same(Data * data)
57 {
58     return (valid && data->valid) && (data == this || (known == data->known && sharedSyms == data->sharedSyms));
59 }
60
61 void Data::setValidity(const bool v)
62 {
63     if (valid && !v)
64     {
65         valid = false;
66         sharedSyms.clear();
67     }
68 }
69
70 std::wostream & operator<<(std::wostream & out, const Data & data)
71 {
72     out << L"known:" << (data.known ? L"T" : L"F")
73         << L", valid:" << (data.valid ? L"T" : L"F")
74         << L", ";
75
76     tools::printSet(data.sharedSyms, out);
77
78     return out;
79 }
80
81 } // namespace analysis