Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / ast / includes / analysis / data / CompleteMacroSignature.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __COMPLETE_MACRO_SIGNATURE_HXX__
17 #define __COMPLETE_MACRO_SIGNATURE_HXX__
18
19 #include <iostream>
20 #include <set>
21 #include <unordered_set>
22
23 #include "alltypes.hxx"
24 #include "allexp.hxx"
25 #include "MacroDef.hxx"
26 #include "MacroSignature.hxx"
27 #include "TITypeTuple.hxx"
28 #include "TITypeSignatureTuple.hxx"
29
30 namespace analysis
31 {
32
33 struct MacroOut
34 {
35     TITypeTuple tuple;
36     int maxVarId;
37 };
38
39 class AnalysisVisitor;
40 class DataManager;
41
42 /**
43  * \struct CompleteMacroSignature
44  * \brief a MacroSignature is not enought to determinate a macro
45  * Since a macro can use variables not defined in its scope and since constraints can be applied to arguments
46  * we need to have a more complete signature.
47  */
48 class CompleteMacroSignature
49 {
50     struct __MPCMO
51     {
52         uint64_t id;
53         MPolyConstraintSet verified;
54         ConstraintManager::UnverifiedSet unverified;
55         std::set<symbol::Symbol> globalConstants;
56         MacroOut out;
57
58         __MPCMO(const uint64_t _id, const MPolyConstraintSet & _verified, const ConstraintManager::UnverifiedSet & _unverified, const std::set<symbol::Symbol> & _globalConstants, MacroOut && _out) : id(_id), verified(_verified), unverified(_unverified), globalConstants(_globalConstants), out(_out) { }
59
60         inline std::size_t getUnverifiedSize() const
61         {
62             std::size_t size = 0;
63             for (const auto & mpcs : unverified)
64             {
65                 size += mpcs.size();
66             }
67             return size;
68         }
69
70         struct Compare
71         {
72             inline bool operator()(const __MPCMO & L, const __MPCMO & R) const
73             {
74                 std::size_t sizeL = L.getUnverifiedSize();
75                 std::size_t sizeR = R.getUnverifiedSize();
76                 if (sizeL < sizeR)
77                 {
78                     return true;
79                 }
80                 else if (sizeL == sizeR)
81                 {
82                     sizeL = L.verified.size();
83                     sizeR = R.verified.size();
84                     if (sizeL < sizeR)
85                     {
86                         return true;
87                     }
88                     else if (sizeL == sizeR)
89                     {
90                         return L.id < R.id;
91                     }
92                 }
93                 return false;
94             }
95         };
96     };
97
98     uint64_t & id;
99     // This map contains the signatures corresponding to the global symbols mapped to out types
100     std::set<__MPCMO, __MPCMO::Compare> outMap;
101     GVN & gvn;
102
103 public:
104
105     CompleteMacroSignature(GVN & _gvn, uint64_t & _id) : id(_id), gvn(_gvn) { }
106
107     inline GVN & getGVN()
108     {
109         return gvn;
110     }
111
112     const MacroOut * getOutTypes(AnalysisVisitor & visitor, const MacroSignature & signature, MacroDef * macrodef, DataManager & dm, const unsigned int rhs, std::vector<TIType> & in, const std::vector<GVN::Value *> values, uint64_t & functionId);
113
114     const MacroOut * analyze(AnalysisVisitor & visitor, const MacroSignature & signature, MacroDef * macrodef, DataManager & dm, const unsigned int rhs, std::vector<TIType> & in, const std::vector<GVN::Value *> values, uint64_t & functionId);
115
116     friend std::ostream & operator<<(std::ostream & out, const CompleteMacroSignature & cms);
117
118 };
119
120 } // namespace analysis
121
122 #endif // __COMPLETE_MACRO_SIGNATURE_HXX__