utf: ast 2
[scilab.git] / scilab / modules / ast / src / cpp / types / inspector.cpp
index 35060be..6ca44b6 100644 (file)
 #include <string>
 #include <iostream>
 #include <map>
+#include <unordered_set>
 
 #include "inspector.hxx"
 #include "types.hxx"
+#include "string.hxx"
 
 namespace types
 {
 #ifndef NDEBUG
-std::vector<InternalType*> Inspector::m_vIT;
+std::unordered_set<InternalType*> Inspector::m_vIT;
 
 size_t Inspector::getItemCount()
 {
@@ -30,9 +32,9 @@ size_t Inspector::getItemCount()
 size_t Inspector::getUnreferencedItemCount()
 {
     int iCount = 0;
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
+    for (auto it : m_vIT)
     {
-        if (m_vIT[i]->getRef() == 0)
+        if (it->getRef() == 0)
         {
             iCount++;
         }
@@ -44,43 +46,35 @@ size_t Inspector::getUnreferencedItemCount()
 void Inspector::addItem(InternalType* _pIT)
 {
     types::GenericType* pGT = _pIT->getAs<types::GenericType>();
-    m_vIT.push_back(_pIT);
+    m_vIT.insert(_pIT);
 }
 
 void Inspector::removeItem(InternalType* _pIT)
 {
-    std::vector<InternalType*>::iterator it;
-    for (it = m_vIT.begin() ; it != m_vIT.end() ; it++)
-    {
-        if ((*it) == _pIT)
-        {
-            types::GenericType* pGT = _pIT->getAs<types::GenericType>();
-            m_vIT.erase(it);
-            break;
-        }
-    }
+    m_vIT.erase(_pIT);
 }
 
 InternalType* Inspector::getItem(size_t _iPos)
 {
-    if (_iPos >= m_vIT.size())
+    if (m_vIT.size() > _iPos)
     {
-        return NULL;
+        return *std::next(m_vIT.begin(), _iPos);
     }
-    return m_vIT[_iPos];
+
+    return NULL;
 }
 
 InternalType* Inspector::getUnreferencedItem(size_t _iPos)
 {
     size_t iCount = 0;
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
+    for (auto it : m_vIT)
     {
-        if (m_vIT[i]->getRef() == 0)
+        if (it->getRef() == 0)
         {
             if (iCount == _iPos)
             {
-                std::wcout << L"getUnreferencedItem : " << m_vIT[i] << std::endl;
-                return m_vIT[i];
+                std::cout << "getUnreferencedItem : " << it << std::endl;
+                return it;
             }
             iCount++;
         }
@@ -89,13 +83,13 @@ InternalType* Inspector::getUnreferencedItem(size_t _iPos)
     return NULL;
 }
 
-std::wstring Inspector::showItem(size_t _iPos)
+std::string Inspector::showItem(size_t _iPos)
 {
-    std::wstring st;
+    std::string st;
     InternalType* pIT = getItem(_iPos);
     if (pIT == NULL)
     {
-        st = L"NULL";
+        st = "NULL";
     }
     else
     {
@@ -104,13 +98,13 @@ std::wstring Inspector::showItem(size_t _iPos)
     return st;
 }
 
-std::wstring Inspector::showUnreferencedItem(size_t _iPos)
+std::string Inspector::showUnreferencedItem(size_t _iPos)
 {
-    std::wstring st;
+    std::string st;
     InternalType* pIT = getUnreferencedItem(_iPos);
     if (pIT == NULL)
     {
-        st = L"NULL";
+        st = "NULL";
     }
     else
     {
@@ -121,51 +115,38 @@ std::wstring Inspector::showUnreferencedItem(size_t _iPos)
 
 void Inspector::deleteItems()
 {
-    InternalType** pIT = new InternalType*[m_vIT.size()];
-
-    //copy item values
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
-    {
-        pIT[i] = m_vIT[i];
-    }
-
-    //delete each item
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
+    for (auto it : m_vIT)
     {
-        delete pIT[i];
+        delete it;
     }
 
-    //check vector update
-    if (m_vIT.size() != 0)
-    {
-        printf("Oo\n");
-    }
+    m_vIT.clear();
 }
 
 void Inspector::displayMemleak()
 {
-    std::map<std::wstring, size_t> statistics;
+    std::map<std::string, size_t> statistics;
 
     if (m_vIT.size() != 0)
     {
         // construct the statistic map
-        for (size_t i = 0; i < m_vIT.size(); ++i)
+        for (auto it : m_vIT)
         {
-            statistics[m_vIT[i]->getTypeStr()]++;
+            statistics[it->getTypeStr()]++;
         }
 
         // display the result
-        std::wcerr << L"Memory leaked, please file a bug on http://bugzilla.scilab.org" << std::endl;
-        for (auto it = statistics.begin(), itEnd = statistics.end(); it != itEnd;  ++it)
+        std::wcerr << "Memory leaked, please file a bug on http://bugzilla.scilab.org" << std::endl;
+        for (auto it = statistics.begin(), itEnd = statistics.end(); it != itEnd; ++it)
         {
-            std::wcerr << L"    " << it->second << L" " << it->first;
+            std::cerr << "    " << it->second << " " << it->first;
 
             // list the not free-ed pointers
-            std::wcerr << L" : ";
+            std::cerr << " : ";
             bool isFirst = true;
-            for (size_t i = 0; i < m_vIT.size(); ++i)
+            for (auto pi : m_vIT)
             {
-                if (it->first == m_vIT[i]->getTypeStr())
+                if (it->first == pi->getTypeStr())
                 {
                     if (isFirst)
                     {
@@ -175,13 +156,19 @@ void Inspector::displayMemleak()
                     {
                         std::wcerr << " , ";
                     }
-                    std::wcerr << m_vIT[i];
+
+                    std::wcerr << pi;
+
+                    if (pi->isString())
+                    {
+                        types::String* pS = pi->getAs<types::String>();
+                        std::wcerr << pS->get(0) << std::endl;
+                    }
                 }
             }
 
             std::wcerr << std::endl;
         }
-
     }
 }