]> Creatis software - bbtk.git/blob - kernel/src/bbtkObject.cxx
=== MAJOR RELEASE ====
[bbtk.git] / kernel / src / bbtkObject.cxx
1 #include "bbtkObject.h"
2 #include "bbtkMessageManager.h"
3
4 namespace bbtk
5
6   
7
8   //=======================================================================
9   Object::ObjectListType Object::mgObjectList;
10   //=======================================================================
11
12   //=======================================================================
13   Object::Object()
14   { 
15   }
16   //=======================================================================
17
18
19   //=======================================================================
20   Object::~Object()
21   { 
22   }
23   //=======================================================================
24
25   //=======================================================================
26   void Object::InsertInObjectList(Pointer p)
27   { 
28     bbtkDebugMessage("object",9,"##> Object::InsertInObjectList(\""
29                      <<p->GetObjectName()<<"\" ["<<p<<"])"<<std::endl);
30     boost::weak_ptr<Object> w(p);
31     mgObjectList.insert(w); 
32   }
33   //=======================================================================
34
35
36   //=======================================================================
37   void Object::RemoveFromObjectList(WeakPointer p)
38   { 
39     bbtkDebugMessage("object",9,"##> Object::RemoveFromObjectList()"
40                      <<std::endl);
41     mgObjectList.erase(p);
42
43   }
44   //=======================================================================
45
46
47   //=======================================================================
48   std::string Object::GetObjectName() const
49   {
50     return std::string("**Unknown object**");
51   }
52   //=======================================================================
53
54   //=======================================================================
55   std::string Object::GetObjectInfo() const
56   {
57     return std::string("");
58   }
59   //=======================================================================
60   
61   //=======================================================================
62   void Object::PrintObjectListInfo()
63   {
64     
65     std::cout 
66       << "=============== Living bbtk::Object pointers ========="<<std::endl;
67
68     long n = 0;
69     long u = 0;
70     size_t m = 0;
71     ObjectListType::iterator i;
72     for (i = mgObjectList.begin();
73          i!=mgObjectList.end();
74          ++i)
75       {
76         if (i->use_count() == 0) 
77           {
78             u++;
79           }
80         else 
81           { 
82             Object::Pointer p(i->lock());
83             PrintObjectInfo(p);
84             n++;
85             m += p->GetObjectSize();
86           }
87       }
88     std::cout 
89       << "------------------------------------------------------"<<std::endl; 
90
91     std::cout << " Total : "<<n<<" objects - "<<m<<" b"<<std::endl;
92     if (u==1)
93       {
94         std::cout<<"* Note : "<<u
95                  <<" object in list has 0 ref count, "
96                  <<"i.e. destroyed without removing itself from the living objects list ! (this is just an implementation error not a memory leak)"<<std::endl;
97       }
98     else if (u>1)
99       {
100         std::cout<<"* Note : "<<u
101                  <<" objects in list have 0 ref count, "
102                  <<"i.e. destroyed without removing themselves from the living objects list ! (this is just an implementation error not a memory leak)"<<std::endl;
103       }
104     std::cout
105       << "============ EO Living bbtk::Object pointers ========="<<std::endl;
106         
107   }
108   //=======================================================================
109
110   //=======================================================================
111   void Object::PrintObjectInfo(const std::string& name)
112   {
113     long n = 0;
114     ObjectListType::iterator i;
115     for (i = mgObjectList.begin();
116          i!=mgObjectList.end();
117          ++i)
118       {
119         n++;
120         if (i->use_count() == 0) continue;
121         Object::Pointer p(i->lock());   
122         if (p->GetObjectName().find(name) != std::string::npos ) 
123           {
124             std::cout << n << "/" << mgObjectList.size() << " ";
125             PrintObjectInfo(p);
126           }
127       }
128   }
129   //=======================================================================
130
131   //=======================================================================
132   void Object::PrintObjectInfo(const Object::Pointer& p)
133   {
134     std::cout << "* [" << p << "] \t" 
135               << p.use_count()-1 << " r \t"
136               << p->GetObjectRecursiveSize() << " ("
137               << p->GetObjectSize() << ") b \t"
138               << p->GetObjectName() 
139               << std::endl;
140     std::cout << p->GetObjectInfo();
141   }
142   //=======================================================================
143
144   //=======================================================================
145   /// Objects deleter
146   void Object::Deleter::operator() (Object* p)
147   {
148     std::string name = p->GetObjectName();
149     void* adr = (void*)p;
150     bbtkDebugMessage("object",1,"##> Object::Deleter : deleting \""
151                      <<name<<"\" ["<<adr<<"]"<<std::endl);
152     Object::RemoveFromObjectList(mPointer);
153     this->Delete(p);
154     bbtkDebugMessage("object",2,"<## Object::Deleter : \""<<name<<"\" ["
155                      <<adr<<"] deleted"<<std::endl);
156   }
157   //=======================================================================
158
159
160
161
162
163
164
165
166
167   //=======================================================================
168   bool StaticInitTime::PrintObjectListInfo = false;
169   //=======================================================================
170   //=======================================================================
171   StaticInitTime::StaticInitTime() 
172   {
173   }
174   //=======================================================================
175   //=======================================================================
176   StaticInitTime::~StaticInitTime()
177   {
178     if (PrintObjectListInfo) 
179       {
180         std::cout << std::endl
181                   << "***************** main ended *******************"
182                   << std::endl << std::endl;
183         Object::PrintObjectListInfo();
184       }
185   }
186   //=======================================================================
187   //=======================================================================
188   //  The static instance
189   static StaticInitTime i;
190   //=======================================================================
191
192 }