IpReferenced.hpp
Go to the documentation of this file.
1 // Copyright (C) 2004, 2006 International Business Machines and others.
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // $Id: IpReferenced.hpp 1861 2010-12-21 21:34:47Z andreasw $
6 //
7 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
8 
9 #ifndef __IPREFERENCED_HPP__
10 #define __IPREFERENCED_HPP__
11 
12 #include "IpTypes.hpp"
13 #include "IpDebug.hpp"
14 
15 #include <list>
16 
17 namespace Ipopt
18 {
19 
23  class Referencer
24  {}
25  ;
26 
167  {
168  public:
170  :
172  {}
173 
175  {
177  }
178 
179  Index ReferenceCount() const;
180 
181  void AddRef(const Referencer* referencer) const;
182 
183  void ReleaseRef(const Referencer* referencer) const;
184 
185  private:
187 
188 # ifdef REF_DEBUG
189 
190  mutable std::list<const Referencer*> referencers_;
191 # endif
192 
193  };
194 
195  /* inline methods */
196  inline
198  {
199  // DBG_START_METH("ReferencedObject::ReferenceCount()", 0);
200  // DBG_PRINT((1,"Returning reference_count_ = %d\n", reference_count_));
201  return reference_count_;
202  }
203 
204  inline
205  void ReferencedObject::AddRef(const Referencer* referencer) const
206  {
207  // DBG_START_METH("ReferencedObject::AddRef(const Referencer* referencer)", 0);
209  // DBG_PRINT((1, "New reference_count_ = %d\n", reference_count_));
210 # ifdef REF_DEBUG
211 
212  referencers_.push_back(referencer);
213 # endif
214 
215  }
216 
217  inline
218  void ReferencedObject::ReleaseRef(const Referencer* referencer) const
219  {
220  // DBG_START_METH("ReferencedObject::ReleaseRef(const Referencer* referencer)",
221  // 0);
223  // DBG_PRINT((1, "New reference_count_ = %d\n", reference_count_));
224 
225 # ifdef REF_DEBUG
226 
227  bool found = false;
228  std::list<const Referencer*>::iterator iter;
229  for (iter = referencers_.begin(); iter != referencers_.end(); iter++) {
230  if ((*iter) == referencer) {
231  found = true;
232  break;
233  }
234  }
235 
236  // cannot call release on a reference that was never added...
237  DBG_ASSERT(found);
238 
239  if (found) {
240  referencers_.erase(iter);
241  }
242 # endif
243 
244  }
245 
246 
247 } // namespace Ipopt
248 
249 #endif