X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/109e2ca4349381ca7ed73f78795f1779c33143e5..9aea2510431d7109ff7055bce02576ebd80f593b:/include/wx/any.h?ds=sidebyside diff --git a/include/wx/any.h b/include/wx/any.h index 366f4bc5e3..092e71078d 100644 --- a/include/wx/any.h +++ b/include/wx/any.h @@ -16,8 +16,8 @@ #if wxUSE_ANY +#include // for placement new #include "wx/string.h" -#include "wx/meta/pod.h" #include "wx/meta/if.h" #include "wx/typeinfo.h" @@ -193,18 +193,24 @@ namespace wxPrivate { template -class wxAnyValueTypeOpsPOD +class wxAnyValueTypeOpsInplace { public: static void DeleteValue(wxAnyValueBuffer& buf) { - wxUnusedVar(buf); + T* value = reinterpret_cast(&buf.m_buffer[0]); + value->~T(); + + // Some compiler may given 'unused variable' warnings without this + wxUnusedVar(value); } static void SetValue(const T& value, wxAnyValueBuffer& buf) { - memcpy(buf.m_buffer, &value, sizeof(T)); + // Use placement new + void* const place = buf.m_buffer; + ::new(place) T(value); } static const T& GetValue(const wxAnyValueBuffer& buf) @@ -270,9 +276,8 @@ public: template class wxAnyValueTypeImplBase : public wxAnyValueType { - typedef typename wxIf< wxIsPod::value && - sizeof(T) <= WX_ANY_VALUE_BUFFER_SIZE, - wxPrivate::wxAnyValueTypeOpsPOD, + typedef typename wxIf< sizeof(T) <= WX_ANY_VALUE_BUFFER_SIZE, + wxPrivate::wxAnyValueTypeOpsInplace, wxPrivate::wxAnyValueTypeOpsGeneric >::value Ops; @@ -782,8 +787,9 @@ public: @remarks You cannot reliably test whether two wxAnys are of same value type by simply comparing return values - of wxAny::GetType(). Instead use - wxAnyValueType::CheckType() template function. + of wxAny::GetType(). Instead, use wxAny::HasSameType(). + + @see HasSameType() */ const wxAnyValueType* GetType() const { @@ -791,7 +797,16 @@ public: } /** - Tests if wxAny is null (that is, whether there is data). + Returns @true if this and another wxAny have the same + value type. + */ + bool HasSameType(const wxAny& other) const + { + return GetType()->IsSameType(other.GetType()); + } + + /** + Tests if wxAny is null (that is, whether there is no data). */ bool IsNull() const {