utf: ast 2
[scilab.git] / scilab / modules / ast / src / cpp / types / inspector.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2011 - DIGITEO - Antoine ELIAS
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 <string>
14 #include <iostream>
15 #include <map>
16 #include <unordered_set>
17
18 #include "inspector.hxx"
19 #include "types.hxx"
20 #include "string.hxx"
21
22 namespace types
23 {
24 #ifndef NDEBUG
25 std::unordered_set<InternalType*> Inspector::m_vIT;
26
27 size_t Inspector::getItemCount()
28 {
29     return m_vIT.size();
30 }
31
32 size_t Inspector::getUnreferencedItemCount()
33 {
34     int iCount = 0;
35     for (auto it : m_vIT)
36     {
37         if (it->getRef() == 0)
38         {
39             iCount++;
40         }
41     }
42     return iCount;
43 }
44
45
46 void Inspector::addItem(InternalType* _pIT)
47 {
48     types::GenericType* pGT = _pIT->getAs<types::GenericType>();
49     m_vIT.insert(_pIT);
50 }
51
52 void Inspector::removeItem(InternalType* _pIT)
53 {
54     m_vIT.erase(_pIT);
55 }
56
57 InternalType* Inspector::getItem(size_t _iPos)
58 {
59     if (m_vIT.size() > _iPos)
60     {
61         return *std::next(m_vIT.begin(), _iPos);
62     }
63
64     return NULL;
65 }
66
67 InternalType* Inspector::getUnreferencedItem(size_t _iPos)
68 {
69     size_t iCount = 0;
70     for (auto it : m_vIT)
71     {
72         if (it->getRef() == 0)
73         {
74             if (iCount == _iPos)
75             {
76                 std::cout << "getUnreferencedItem : " << it << std::endl;
77                 return it;
78             }
79             iCount++;
80         }
81     }
82
83     return NULL;
84 }
85
86 std::string Inspector::showItem(size_t _iPos)
87 {
88     std::string st;
89     InternalType* pIT = getItem(_iPos);
90     if (pIT == NULL)
91     {
92         st = "NULL";
93     }
94     else
95     {
96         st = pIT->getTypeStr();
97     }
98     return st;
99 }
100
101 std::string Inspector::showUnreferencedItem(size_t _iPos)
102 {
103     std::string st;
104     InternalType* pIT = getUnreferencedItem(_iPos);
105     if (pIT == NULL)
106     {
107         st = "NULL";
108     }
109     else
110     {
111         st = pIT->getTypeStr();
112     }
113     return st;
114 }
115
116 void Inspector::deleteItems()
117 {
118     for (auto it : m_vIT)
119     {
120         delete it;
121     }
122
123     m_vIT.clear();
124 }
125
126 void Inspector::displayMemleak()
127 {
128     std::map<std::string, size_t> statistics;
129
130     if (m_vIT.size() != 0)
131     {
132         // construct the statistic map
133         for (auto it : m_vIT)
134         {
135             statistics[it->getTypeStr()]++;
136         }
137
138         // display the result
139         std::wcerr << "Memory leaked, please file a bug on http://bugzilla.scilab.org" << std::endl;
140         for (auto it = statistics.begin(), itEnd = statistics.end(); it != itEnd; ++it)
141         {
142             std::cerr << "    " << it->second << " " << it->first;
143
144             // list the not free-ed pointers
145             std::cerr << " : ";
146             bool isFirst = true;
147             for (auto pi : m_vIT)
148             {
149                 if (it->first == pi->getTypeStr())
150                 {
151                     if (isFirst)
152                     {
153                         isFirst = false;
154                     }
155                     else
156                     {
157                         std::wcerr << " , ";
158                     }
159
160                     std::wcerr << pi;
161
162                     if (pi->isString())
163                     {
164                         types::String* pS = pi->getAs<types::String>();
165                         std::wcerr << pS->get(0) << std::endl;
166                     }
167                 }
168             }
169
170             std::wcerr << std::endl;
171         }
172     }
173 }
174
175 #endif
176 }