00001 // Copyright (C) 2004, 2006 International Business Machines and others. 00002 // All Rights Reserved. 00003 // This code is published under the Eclipse Public License. 00004 // 00005 // $Id: IpReferenced.hpp 2171 2013-03-30 15:43:58Z stefan $ 00006 // 00007 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 00008 00009 #ifndef __IPREFERENCED_HPP__ 00010 #define __IPREFERENCED_HPP__ 00011 00012 #include "IpTypes.hpp" 00013 #include "IpDebug.hpp" 00014 00015 #include <list> 00016 00017 namespace Ipopt 00018 { 00019 00023 class Referencer 00024 {} 00025 ; 00026 00166 class ReferencedObject 00167 { 00168 public: 00169 ReferencedObject() 00170 : 00171 reference_count_(0) 00172 {} 00173 00174 virtual ~ReferencedObject() 00175 { 00176 DBG_ASSERT(reference_count_ == 0); 00177 } 00178 00179 inline 00180 Index ReferenceCount() const; 00181 00182 inline 00183 void AddRef(const Referencer* referencer) const; 00184 00185 inline 00186 void ReleaseRef(const Referencer* referencer) const; 00187 00188 private: 00189 mutable Index reference_count_; 00190 00191 # ifdef REF_DEBUG 00192 00193 mutable std::list<const Referencer*> referencers_; 00194 # endif 00195 00196 }; 00197 00198 /* inline methods */ 00199 inline 00200 Index ReferencedObject::ReferenceCount() const 00201 { 00202 // DBG_START_METH("ReferencedObject::ReferenceCount()", 0); 00203 // DBG_PRINT((1,"Returning reference_count_ = %d\n", reference_count_)); 00204 return reference_count_; 00205 } 00206 00207 inline 00208 void ReferencedObject::AddRef(const Referencer* referencer) const 00209 { 00210 // DBG_START_METH("ReferencedObject::AddRef(const Referencer* referencer)", 0); 00211 reference_count_++; 00212 // DBG_PRINT((1, "New reference_count_ = %d\n", reference_count_)); 00213 # ifdef REF_DEBUG 00214 00215 referencers_.push_back(referencer); 00216 # endif 00217 00218 } 00219 00220 inline 00221 void ReferencedObject::ReleaseRef(const Referencer* referencer) const 00222 { 00223 // DBG_START_METH("ReferencedObject::ReleaseRef(const Referencer* referencer)", 00224 // 0); 00225 reference_count_--; 00226 // DBG_PRINT((1, "New reference_count_ = %d\n", reference_count_)); 00227 00228 # ifdef REF_DEBUG 00229 00230 bool found = false; 00231 std::list<const Referencer*>::iterator iter; 00232 for (iter = referencers_.begin(); iter != referencers_.end(); iter++) { 00233 if ((*iter) == referencer) { 00234 found = true; 00235 break; 00236 } 00237 } 00238 00239 // cannot call release on a reference that was never added... 00240 DBG_ASSERT(found); 00241 00242 if (found) { 00243 referencers_.erase(iter); 00244 } 00245 # endif 00246 00247 } 00248 00249 00250 } // namespace Ipopt 00251 00252 #endif