}
}
- void AssignCopy( const wxWeakRefStatic& wr )
+ void AssignCopy(const wxWeakRefStatic& wr)
{
Assign( wr.m_pobj );
}
T *m_pobj;
};
-#ifdef HAVE_PARTIAL_SPECIALIZATION
+#if !defined(HAVE_PARTIAL_SPECIALIZATION) || !defined(HAVE_TEMPLATE_OVERLOAD_RESOLUTION)
+ #define USE_STATIC_WEAKREF
+#endif
+
+
+#ifndef USE_STATIC_WEAKREF
template<class T,bool use_static>
struct wxWeakRefImpl;
void AssignCopy(const wxWeakRefImpl& wr)
{
- DoAssign( wr.m_pobj, wr.m_ptbase );
+ DoAssign(wr.m_pobj, wr.m_ptbase);
}
void DoAssign( T* pobj, wxTrackable *ptbase ) {
wxTrackable *m_ptbase;
};
-#endif // HAVE_PARTIAL_SPECIALIZATION
+#endif // #ifndef USE_STATIC_WEAKREF
+
// A weak reference to an object of type T, where T has type wxTrackable
// (usually statically but if not dynamic_cast<> is tried).
template <class T>
class wxWeakRef : public
-#ifdef HAVE_PARTIAL_SPECIALIZATION
- wxWeakRefImpl<T, wxIsStaticTrackable<T>::value>
-#else
+#ifdef USE_STATIC_WEAKREF
wxWeakRefStatic<T>
+#else
+ wxWeakRefImpl<T, wxIsStaticTrackable<T>::value>
#endif
{
public:
Assign(pobj);
}
+ // We need this copy ctor, since otherwise a default compiler (binary) copy happens
+ wxWeakRef(const wxWeakRef<T>& wr)
+ {
+ Assign(wr.get());
+ }
+
template <class TDerived>
wxWeakRef<T>& operator=(TDerived* pobj)
{
return *this;
}
- virtual ~wxWeakRef() { Release(); }
+ virtual ~wxWeakRef() { this->Release(); }
// Smart pointer functions
- T& operator*() const { return *m_pobj; }
- T* operator->() const { return m_pobj; }
+ T& operator*() const { return *this->m_pobj; }
+ T* operator->() const { return this->m_pobj; }
- T* get() const { return m_pobj; }
-
- // test for pointer validity: defining conversion to unspecified_bool_type
- // and not more obvious bool to avoid implicit conversions to integer types
- typedef T *(wxWeakRef<T>::*unspecified_bool_type)() const;
- operator unspecified_bool_type() const
- {
- return this->m_pobj ? &wxWeakRef<T>::get : NULL;
- }
+ T* get() const { return this->m_pobj; }
+ operator T*() const { return get(); }
};
// Weak ref implementation assign objects are queried for wxTrackable
// using dynamic_cast<>
-template<class T>
+template <class T>
class wxWeakRefDynamic : public wxTrackerNode
{
public:
}
}
- void AssignCopy(const wxWeakRefDynamic& wr)
- {
- Assign(wr.m_pobj);
- }
-
virtual void OnObjectDestroy()
{
wxASSERT_MSG( m_pobj, "tracked object should have removed us itself" );
// Provide some basic types of weak references
class WXDLLIMPEXP_FWD_BASE wxEvtHandler;
-class WXDLLIMPEXP_FWD_BASE wxWindow;
+class WXDLLIMPEXP_FWD_CORE wxWindow;
typedef wxWeakRef<wxEvtHandler> wxEvtHandlerRef;
typedef wxWeakRef<wxWindow> wxWindowRef;