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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 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()
 | 
			
		||||
    {
 | 
			
		||||
        if (m_ptr)
 | 
			
		||||
@@ -330,6 +339,17 @@ public:
 | 
			
		||||
        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)
 | 
			
		||||
    {
 | 
			
		||||
        if (m_ptr)
 | 
			
		||||
 
 | 
			
		||||
@@ -585,11 +585,17 @@ public:
 | 
			
		||||
    */
 | 
			
		||||
    wxObjectDataPtr(T* ptr = NULL);
 | 
			
		||||
 | 
			
		||||
    //@{
 | 
			
		||||
    /**
 | 
			
		||||
        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.
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
    //@}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -649,7 +655,11 @@ public:
 | 
			
		||||
    //@{
 | 
			
		||||
    /**
 | 
			
		||||
        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=(T* ptr);
 | 
			
		||||
    //@}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user