////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/intrusive for documentation. // ////////////////////////////////////////////////////////////////////////////// #include #include #include #include template class CompleteSmartPtr { template friend class CompleteSmartPtr; public: #if !defined(BOOST_NO_TEMPLATE_ALIASES) template using rebind = CompleteSmartPtr; #else template struct rebind { typedef CompleteSmartPtr other; }; #endif typedef char difference_type; typedef T element_type; CompleteSmartPtr() : ptr_(0) {} explicit CompleteSmartPtr(T &p) : ptr_(&p) {} CompleteSmartPtr(const CompleteSmartPtr &c) { this->ptr_ = c.ptr_; } CompleteSmartPtr & operator=(const CompleteSmartPtr &c) { this->ptr_ = c.ptr_; } static CompleteSmartPtr pointer_to(T &r) { return CompleteSmartPtr(r); } T * operator->() const { return ptr_; } T & operator *() const { return *ptr_; } template static CompleteSmartPtr static_cast_from(const CompleteSmartPtr &uptr) { return CompleteSmartPtr(*static_cast(uptr.ptr_)); } template static CompleteSmartPtr const_cast_from(const CompleteSmartPtr &uptr) { return CompleteSmartPtr(*const_cast(uptr.ptr_)); } template static CompleteSmartPtr dynamic_cast_from(const CompleteSmartPtr &uptr) { return CompleteSmartPtr(*dynamic_cast(uptr.ptr_)); } friend bool operator ==(const CompleteSmartPtr &l, const CompleteSmartPtr &r) { return l.ptr_ == r.ptr_; } friend bool operator !=(const CompleteSmartPtr &l, const CompleteSmartPtr &r) { return l.ptr_ != r.ptr_; } private: T *ptr_; }; template class SimpleSmartPtr { public: SimpleSmartPtr() : ptr_(0) {} explicit SimpleSmartPtr(T *p) : ptr_(p) {} SimpleSmartPtr(const SimpleSmartPtr &c) { this->ptr_ = c.ptr_; } SimpleSmartPtr & operator=(const SimpleSmartPtr &c) { this->ptr_ = c.ptr_; } friend bool operator ==(const SimpleSmartPtr &l, const SimpleSmartPtr &r) { return l.ptr_ == r.ptr_; } friend bool operator !=(const SimpleSmartPtr &l, const SimpleSmartPtr &r) { return l.ptr_ != r.ptr_; } T* operator->() const { return ptr_; } T & operator *() const { return *ptr_; } private: T *ptr_; }; class B{ public: virtual ~B(){} }; class D : public B {}; class DD : public virtual B {}; int main() { int dummy; //Raw pointer BOOST_STATIC_ASSERT(( boost::is_same::element_type, int>::value )); BOOST_STATIC_ASSERT(( boost::is_same::pointer, int*>::value )); BOOST_STATIC_ASSERT(( boost::is_same::difference_type, std::ptrdiff_t>::value )); BOOST_STATIC_ASSERT(( boost::is_same::rebind_pointer::type , double*>::value )); if(boost::intrusive::pointer_traits::pointer_to(dummy) != &dummy){ return 1; } if(boost::intrusive::pointer_traits::static_cast_from((B*)0)){ return 1; } if(boost::intrusive::pointer_traits::const_cast_from((const D*)0)){ return 1; } if(boost::intrusive::pointer_traits::dynamic_cast_from((B*)0)){ return 1; } //Complete smart pointer BOOST_STATIC_ASSERT(( boost::is_same >::element_type, int>::value )); BOOST_STATIC_ASSERT(( boost::is_same >::pointer, CompleteSmartPtr >::value )); BOOST_STATIC_ASSERT(( boost::is_same >::difference_type, char>::value )); BOOST_STATIC_ASSERT(( boost::is_same >::rebind_pointer::type , CompleteSmartPtr >::value )); if(boost::intrusive::pointer_traits< CompleteSmartPtr > ::pointer_to(dummy) != CompleteSmartPtr(dummy)){ return 1; } if(boost::intrusive::pointer_traits< CompleteSmartPtr >:: static_cast_from(CompleteSmartPtr()) != CompleteSmartPtr()){ return 1; } if(boost::intrusive::pointer_traits< CompleteSmartPtr >:: const_cast_from(CompleteSmartPtr()) != CompleteSmartPtr()){ return 1; } if(boost::intrusive::pointer_traits< CompleteSmartPtr
>:: dynamic_cast_from(CompleteSmartPtr()) != CompleteSmartPtr
()){ return 1; } //Simple smart pointer BOOST_STATIC_ASSERT(( boost::is_same >::element_type, int>::value )); BOOST_STATIC_ASSERT(( boost::is_same >::pointer, SimpleSmartPtr >::value )); BOOST_STATIC_ASSERT(( boost::is_same >::difference_type, std::ptrdiff_t>::value )); BOOST_STATIC_ASSERT(( boost::is_same >::rebind_pointer::type , SimpleSmartPtr >::value )); if(boost::intrusive::pointer_traits< SimpleSmartPtr > ::pointer_to(dummy) != SimpleSmartPtr(&dummy)){ return 1; } if(boost::intrusive::pointer_traits< SimpleSmartPtr >:: static_cast_from(SimpleSmartPtr()) != SimpleSmartPtr()){ return 1; } if(boost::intrusive::pointer_traits< SimpleSmartPtr >:: const_cast_from(SimpleSmartPtr()) != SimpleSmartPtr()){ return 1; } if(boost::intrusive::pointer_traits< SimpleSmartPtr
>:: dynamic_cast_from(SimpleSmartPtr()) != SimpleSmartPtr
()){ return 1; } return 0; } #include