diff options
Diffstat (limited to 'ace/Auto_Ptr.i')
-rw-r--r-- | ace/Auto_Ptr.i | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/ace/Auto_Ptr.i b/ace/Auto_Ptr.i index 5342f8b8ede..53b5f1db51e 100644 --- a/ace/Auto_Ptr.i +++ b/ace/Auto_Ptr.i @@ -141,3 +141,166 @@ ACE_Auto_Array_Ptr<X>::operator->() const { return this->get (); } + +template <class X, class ACE_LOCK> ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> * +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::create (X *p) +{ + // Yes set ref count to zero. + return new ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> (p); +} + +template <class X, class ACE_LOCK> ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> * +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::attach (ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>*& rep) +{ + ACE_ASSERT (rep != 0); + + ACE_GUARD_RETURN (ACE_LOCK, guard, rep->lock_, rep); + + ++rep->ref_count_; + + return rep; +} + +template <class X, class ACE_LOCK> void +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::detach (ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>*& rep) +{ + ACE_ASSERT (rep != 0); + + ACE_GUARD (ACE_LOCK, guard, rep->lock_); + + if (rep->ref_count_-- == 0) + // We do not need the lock when deleting the representation. + // There should be no side effects from deleting rep and we don + // not want to release a deleted mutex. + delete rep; +} + +template <class X, class ACE_LOCK> void +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::assign (ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>*& rep, ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>* new_rep) +{ + ACE_ASSERT (rep != 0); + ACE_ASSERT (new_rep != 0); + + ACE_GUARD (ACE_LOCK, guard, rep->lock_); + + ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> *old = rep; + rep = new_rep; + + // detached old last for exception safety + if(old->ref_count_-- == 0) + // We do not need the lock when deleting the representation. + // There should be no side effects from deleting rep and we don + // not want to release a deleted mutex. + delete old; +} + +template <class X, class ACE_LOCK> +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::ACE_Refcounted_Auto_Ptr_Rep (X *p) + : ptr_ (p), + ref_count_ (0) +{ +} + +template <class X, class ACE_LOCK> +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::~ACE_Refcounted_Auto_Ptr_Rep (void) +{ +} + +template<class X, class ACE_LOCK> ACE_INLINE X * +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::release (void) +{ + ACE_GUARD_RETURN (ACE_LOCK, guard, this->lock_, 0); + + return this->ptr_.release (); +} + +template<class X, class ACE_LOCK> ACE_INLINE void +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::reset (X *p) +{ + ACE_GUARD (ACE_LOCK, guard, this->lock_); + + this->ptr_.reset (p); +} + +template <class X, class ACE_LOCK> X * +ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK>::get (void) +{ + ACE_GUARD_RETURN (ACE_LOCK, guard, this->lock_, 0); + + return this->ptr_.get (); +} + +template <class X, class ACE_LOCK> +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::ACE_Refcounted_Auto_Ptr (X *p) + : rep_ (AUTO_REFCOUNTED_PTR_REP::create (p)) +{ +} + +template <class X, class ACE_LOCK> +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::ACE_Refcounted_Auto_Ptr (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r) + : rep_ (AUTO_REFCOUNTED_PTR_REP::attach (((ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &) r).rep_)) +{ +} + +template <class X, class ACE_LOCK> +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::~ACE_Refcounted_Auto_Ptr (void) +{ + AUTO_REFCOUNTED_PTR_REP::detach (rep_); +} + +template <class X, class ACE_LOCK> int +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::operator== (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r) const +{ + return r.rep_ == this->rep_; +} + +template <class X, class ACE_LOCK> int +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::operator!= (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r) const +{ + return r.rep_ != this->rep_; +} + +template <class X, class ACE_LOCK> X * +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::operator-> (void) const +{ + return this->rep_->get(); +} + +template<class X, class ACE_LOCK> ACE_INLINE X & +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::operator *() const +{ + return *this->rep_->get (); +} + +template <class X, class ACE_LOCK> X* +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::get (void) +{ + // We return the ACE_Future_rep. + return this->rep_->get (); +} + +template<class X, class ACE_LOCK> ACE_INLINE X * +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::release (void) +{ + return this->rep_->release (); +} + +template<class X, class ACE_LOCK> ACE_INLINE void +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::reset (X *p) +{ + this->rep_->reset (p); +} + +template <class X, class ACE_LOCK> void +ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>::operator = (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &rhs) +{ + // assignment: + // + // bind <this> to the same <ACE_Refcounted_Auto_Ptr_Rep> as <r>. + + // This will work if &r == this, by first increasing the ref count + ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r = (ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &) rhs; + AUTO_REFCOUNTED_PTR_REP::assign (this->rep_, + AUTO_REFCOUNTED_PTR_REP::attach (r.rep_)); +} + |