Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / TITypeTuple.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 __TITYPE_TUPLE_HXX__
14 #define __TITYPE_TUPLE_HXX__
15
16 #include <vector>
17
18 #include "tools.hxx"
19 #include "TIType.hxx"
20
21 namespace analysis
22 {
23 struct TITypeTuple
24 {
25     std::vector<TIType> types;
26
27     TITypeTuple() { }
28
29     TITypeTuple(const std::vector<TIType> & _types) : types(_types)
30     {
31         /*types.reserve(_types.size());
32         for (const auto & type : _types)
33         {
34         types.emplace_back(type.type, type.isscalar());
35         }*/
36     }
37
38     inline std::size_t size() const
39     {
40         return types.size();
41     }
42
43     inline std::size_t hash() const
44     {
45         if (types.empty())
46         {
47             return 0;
48         }
49         else
50         {
51             std::size_t seed = types.front().hashPureType();
52             for (std::vector<TIType>::const_iterator i = ++types.begin(), e = types.end(); i != e; ++i)
53             {
54                 seed = tools::hash_combine(seed, i->hashPureType());
55             }
56             return seed;
57         }
58     }
59
60     inline bool operator==(const TITypeTuple & R) const
61     {
62         if (types.size() == R.types.size())
63         {
64             for (std::vector<TIType>::const_iterator i = types.begin(), j = R.types.begin(), e = types.end(); i != e; ++i, ++j)
65             {
66                 if (i->type != j->type || i->isscalar() != j->isscalar())
67                 {
68                     return false;
69                 }
70             }
71             return true;
72         }
73
74         return false;
75     }
76
77     struct Hash
78     {
79         inline std::size_t operator()(const TITypeTuple & tuple) const
80         {
81             return tuple.hash();
82         }
83     };
84
85     struct Eq
86     {
87         inline bool operator()(const TITypeTuple & L, const TITypeTuple & R) const
88         {
89             return L == R;
90         }
91     };
92 };
93
94 } // namespace analysis
95
96 #endif // __TITYPE_TUPLE_HXX__