Allow constructing/assigning wxObjectDataPtr from compatible type
Generalize copy ctor and assignment operators to allow implicit conversions from wxObjectDataPtr<D> to wxObjectDataPtr<B> if D is implicitly convertible to B (e.g. if B is the base class and D is a class derived from it). This makes wxObjectDataPtr<> more like standard smart pointer classes and more useful.
This commit is contained in:
		@@ -278,6 +278,15 @@ public:
 | 
				
			|||||||
            m_ptr->IncRef();
 | 
					            m_ptr->IncRef();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // generalized copy ctor: U must be convertible to T
 | 
				
			||||||
 | 
					    template <typename U>
 | 
				
			||||||
 | 
					    wxObjectDataPtr(const wxObjectDataPtr<U> &tocopy)
 | 
				
			||||||
 | 
					        : m_ptr(tocopy.get())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (m_ptr)
 | 
				
			||||||
 | 
					            m_ptr->IncRef();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ~wxObjectDataPtr()
 | 
					    ~wxObjectDataPtr()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (m_ptr)
 | 
					        if (m_ptr)
 | 
				
			||||||
@@ -330,6 +339,17 @@ public:
 | 
				
			|||||||
        return *this;
 | 
					        return *this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    template <typename U>
 | 
				
			||||||
 | 
					    wxObjectDataPtr& operator=(const wxObjectDataPtr<U> &tocopy)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (m_ptr)
 | 
				
			||||||
 | 
					            m_ptr->DecRef();
 | 
				
			||||||
 | 
					        m_ptr = tocopy.get();
 | 
				
			||||||
 | 
					        if (m_ptr)
 | 
				
			||||||
 | 
					            m_ptr->IncRef();
 | 
				
			||||||
 | 
					        return *this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxObjectDataPtr& operator=(T *ptr)
 | 
					    wxObjectDataPtr& operator=(T *ptr)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (m_ptr)
 | 
					        if (m_ptr)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -585,11 +585,17 @@ public:
 | 
				
			|||||||
    */
 | 
					    */
 | 
				
			||||||
    wxObjectDataPtr(T* ptr = NULL);
 | 
					    wxObjectDataPtr(T* ptr = NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //@{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
        This copy constructor increases the count of the reference counted object to
 | 
					        This copy constructor increases the count of the reference counted object to
 | 
				
			||||||
        which @a tocopy points and then this class will point to, as well.
 | 
					        which @a tocopy points and then this class will point to, as well.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Using @a U different from @c T is only supported since wxWidgets 3.1.5.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
 | 
					    template <typename U>
 | 
				
			||||||
 | 
					    wxObjectDataPtr(const wxObjectDataPtr<U>& tocopy);
 | 
				
			||||||
    wxObjectDataPtr(const wxObjectDataPtr<T>& tocopy);
 | 
					    wxObjectDataPtr(const wxObjectDataPtr<T>& tocopy);
 | 
				
			||||||
 | 
					    //@}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -649,7 +655,11 @@ public:
 | 
				
			|||||||
    //@{
 | 
					    //@{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
        Assignment operator.
 | 
					        Assignment operator.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Using @a U different from @c T is only supported since wxWidgets 3.1.5.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
 | 
					    template <typename U>
 | 
				
			||||||
 | 
					    wxObjectDataPtr<T>& operator=(const wxObjectDataPtr<U>& tocopy);
 | 
				
			||||||
    wxObjectDataPtr<T>& operator=(const wxObjectDataPtr<T>& tocopy);
 | 
					    wxObjectDataPtr<T>& operator=(const wxObjectDataPtr<T>& tocopy);
 | 
				
			||||||
    wxObjectDataPtr<T>& operator=(T* ptr);
 | 
					    wxObjectDataPtr<T>& operator=(T* ptr);
 | 
				
			||||||
    //@}
 | 
					    //@}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user