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