forked from boostorg/intrusive
Add conversion to bool to support the new default casting operations and avoid undefined behavior in castings.
This commit is contained in:
@@ -38,6 +38,8 @@ class CompleteSmartPtr
|
|||||||
{
|
{
|
||||||
template <class U>
|
template <class U>
|
||||||
friend class CompleteSmartPtr;
|
friend class CompleteSmartPtr;
|
||||||
|
void unspecified_bool_type_func() const {}
|
||||||
|
typedef void (CompleteSmartPtr::*unspecified_bool_type)() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||||
@@ -73,17 +75,32 @@ class CompleteSmartPtr
|
|||||||
T & operator *() const
|
T & operator *() const
|
||||||
{ return *ptr_; }
|
{ return *ptr_; }
|
||||||
|
|
||||||
|
operator unspecified_bool_type() const
|
||||||
|
{ return m_ptr? &CompleteSmartPtr::unspecified_bool_type_func : 0; }
|
||||||
|
|
||||||
template<class U>
|
template<class U>
|
||||||
static CompleteSmartPtr static_cast_from(const CompleteSmartPtr<U> &uptr)
|
static CompleteSmartPtr static_cast_from(const CompleteSmartPtr<U> &uptr)
|
||||||
{ ++CompleteSmartPtrStats::static_cast_called; return CompleteSmartPtr(*static_cast<element_type*>(uptr.ptr_)); }
|
{
|
||||||
|
++CompleteSmartPtrStats::static_cast_called;
|
||||||
|
element_type* const p = static_cast<element_type*>(uptr.ptr_);
|
||||||
|
return p ? CompleteSmartPtr(*p) : CompleteSmartPtr();
|
||||||
|
}
|
||||||
|
|
||||||
template<class U>
|
template<class U>
|
||||||
static CompleteSmartPtr const_cast_from(const CompleteSmartPtr<U> &uptr)
|
static CompleteSmartPtr const_cast_from(const CompleteSmartPtr<U> &uptr)
|
||||||
{ ++CompleteSmartPtrStats::const_cast_called; return CompleteSmartPtr(*const_cast<element_type*>(uptr.ptr_)); }
|
{
|
||||||
|
++CompleteSmartPtrStats::const_cast_called;
|
||||||
|
element_type* const p = const_cast<element_type*>(uptr.ptr_);
|
||||||
|
return p ? CompleteSmartPtr(*p) : CompleteSmartPtr();
|
||||||
|
}
|
||||||
|
|
||||||
template<class U>
|
template<class U>
|
||||||
static CompleteSmartPtr dynamic_cast_from(const CompleteSmartPtr<U> &uptr)
|
static CompleteSmartPtr dynamic_cast_from(const CompleteSmartPtr<U> &uptr)
|
||||||
{ ++CompleteSmartPtrStats::dynamic_cast_called; return CompleteSmartPtr(*dynamic_cast<element_type*>(uptr.ptr_)); }
|
{
|
||||||
|
++CompleteSmartPtrStats::dynamic_cast_called;
|
||||||
|
element_type* const p = dynamic_cast<element_type*>(uptr.ptr_);
|
||||||
|
return p ? CompleteSmartPtr(*p) : CompleteSmartPtr();
|
||||||
|
}
|
||||||
|
|
||||||
friend bool operator ==(const CompleteSmartPtr &l, const CompleteSmartPtr &r)
|
friend bool operator ==(const CompleteSmartPtr &l, const CompleteSmartPtr &r)
|
||||||
{ return l.ptr_ == r.ptr_; }
|
{ return l.ptr_ == r.ptr_; }
|
||||||
@@ -99,6 +116,8 @@ class CompleteSmartPtr
|
|||||||
template<class T>
|
template<class T>
|
||||||
class SimpleSmartPtr
|
class SimpleSmartPtr
|
||||||
{
|
{
|
||||||
|
void unspecified_bool_type_func() const {}
|
||||||
|
typedef void (SimpleSmartPtr::*unspecified_bool_type)() const;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SimpleSmartPtr()
|
SimpleSmartPtr()
|
||||||
@@ -127,6 +146,9 @@ class SimpleSmartPtr
|
|||||||
T & operator *() const
|
T & operator *() const
|
||||||
{ return *ptr_; }
|
{ return *ptr_; }
|
||||||
|
|
||||||
|
operator unspecified_bool_type() const
|
||||||
|
{ return ptr_? &SimpleSmartPtr::unspecified_bool_type_func : 0; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T *ptr_;
|
T *ptr_;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user