📄 strictptr.tpp
字号:
// file : Utility/ReferenceCounting/StrictPtr.tpp// author : Boris Kolpackov <boris@kolpackov.net>// copyright : Copyright (c) 2002-2003 Boris Kolpackov// license : http://kolpackov.net/license.htmlnamespace Utility{ namespace ReferenceCounting { // c-tor's & d-tor template <typename T> StrictPtr<T>:: StrictPtr () throw () : ptr_ (0) { } template <typename T> StrictPtr<T>:: StrictPtr (Type* ptr) throw () : ptr_ (ptr) { } template <typename T> StrictPtr<T>:: StrictPtr (StrictPtr<Type> const& s_ptr) throw (Interface::Exception, Interface::SystemException) : ptr_ (add_ref (s_ptr.in ())) { } template <typename T> template <typename Other> StrictPtr<T>:: StrictPtr (StrictPtr<Other> const& s_ptr) throw (Interface::Exception, Interface::SystemException) : ptr_ (add_ref (s_ptr.in ())) { } template <typename T> StrictPtr<T>:: ~StrictPtr () throw () { // This is an additional catch-all layer to protect from // non-conformant Type. try { if (ptr_ != 0) ptr_->remove_ref (); } catch (...) { } } // operator= template <typename T> StrictPtr<T>& StrictPtr<T>::operator= (Type* ptr) throw () { if (ptr_ != 0) ptr_->remove_ref (); ptr_ = ptr; return *this; } template <typename T> StrictPtr<T>& StrictPtr<T>:: operator= (StrictPtr<Type> const& s_ptr) throw (Interface::Exception, Interface::SystemException) { Type* old_ptr (ptr_); Type* new_ptr (add_ref (s_ptr.in ())); // this can throw if (old_ptr != 0) old_ptr->remove_ref (); ptr_ = new_ptr; // commit return *this; } template <typename T> template <typename Other> StrictPtr<T>& StrictPtr<T>:: operator= (StrictPtr<Other> const& s_ptr) throw (Interface::Exception, Interface::SystemException) { Type* old_ptr (ptr_); Other* new_ptr (add_ref (s_ptr.in ())); // this can throw if (old_ptr != 0) old_ptr->remove_ref (); ptr_ = new_ptr; // commit return *this; } // comparison template <typename T> bool StrictPtr<T>:: operator== (Type* other) const throw () { return ptr_ == other; } template <typename T> bool StrictPtr<T>:: operator!= (Type* other) const throw () { return ptr_ != other; } // accessors template <typename T> T* StrictPtr<T>:: operator-> () const throw (NotInitialized) { if (ptr_ == 0) { throw NotInitialized( "Utility::ReferenceCounting::StrictPtr::operator-> : " "unable to dereference NULL pointer."); } return ptr_; } template <typename T> T* StrictPtr<T>:: in () const throw () { return ptr_; } template <typename T> T* StrictPtr<T>:: retn() throw () { Type* ret (ptr_); ptr_ = 0; return ret; } // Specialization of add_ref function for StrictPtr<T> template <typename T> T* add_ref (StrictPtr<T> const& ptr) throw (Interface::Exception, Interface::SystemException) { // delegate to generic implementation return add_ref (ptr.in ()); } // Dynamic type conversion function for StrictPtr's template <typename D, typename S> StrictPtr<D> strict_cast (StrictPtr<S> const& s) throw (Interface::Exception, Interface::SystemException) { return StrictPtr<D>(add_ref (dynamic_cast<D*>(s.in ()))); } }}//StrictPtr.tpp,v 1.1 2005/05/24 04:33:13 turkaye Exp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -