27 #ifndef MLN_UTIL_TRACKED_PTR_HH
28 # define MLN_UTIL_TRACKED_PTR_HH
37 # include <mln/core/contract.hh>
55 typedef std::set<self_t*> holders_t;
61 operator bool()
const;
102 # ifndef MLN_INCLUDE_ONLY
104 template <
typename T>
108 mln_invariant(run_());
112 template <
typename T>
116 mln_invariant(run_());
117 return ! bool(*
this);
120 template <
typename T>
124 mln_invariant(run_());
125 mln_precondition(ptr_ != 0);
129 template <
typename T>
133 mln_invariant(run_());
134 mln_precondition(ptr_ != 0);
138 template <
typename T>
144 mln_invariant(run_());
147 template <
typename T>
156 holders_ =
new holders_t;
157 holders_->insert(
this);
159 mln_invariant(run_());
162 template <
typename T>
166 holders_(rhs.holders_)
168 mln_invariant(rhs.run_());
170 holders_->insert(
this);
171 mln_invariant(run_());
174 template <
typename T>
178 mln_invariant(run_());
179 mln_invariant(rhs.run_());
180 if (&rhs ==
this || rhs.ptr_ == ptr_)
185 holders_ = rhs.holders_;
188 holders_->insert(
this);
189 mln_invariant(run_());
193 template <
typename T>
197 mln_invariant(run_());
207 holders_ =
new holders_t;
208 holders_->insert(
this);
210 mln_invariant(run_());
214 template <
typename T>
221 template <
typename T>
225 mln_invariant((ptr_ && holders_) || (! ptr_ && ! holders_));
228 mln_invariant(holders_->size() > 0);
230 mln_invariant(holders_->find(this_) != holders_->end());
232 typename holders_t::const_iterator i;
233 for (i = holders_->begin(); i != holders_->end(); ++i)
234 mln_invariant((*i)->ptr_ == ptr_);
238 template <
typename T>
240 void tracked_ptr<T>::clean_()
242 mln_invariant(run_());
246 if (holders_->size() == 1)
252 holders_->erase(
this);
255 mln_invariant(run_());
258 template <
typename T>
260 std::ostream& operator<<(std::ostream& ostr, const tracked_ptr<T>& tp)
262 typedef std::set<tracked_ptr<T>*> holders_t;
264 mln_invariant(tp.run_());
265 ostr <<
"tracked_ptr @ " << (&tp)
266 <<
" { ptr = " << tp.ptr_
268 if (tp.holders_ == 0)
272 typename holders_t::const_iterator i;
273 for (i = tp.holders_->begin(); i != tp.holders_->end(); ++i)
281 # endif // ! MLN_INCLUDE_ONLY
288 #endif // ! MLN_UTIL_TRACKED_PTR_HH