From 24985a9b5b993e4e40ed4f1c10860aebe288d525 Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Tue, 29 Sep 2009 13:38:20 +0000 Subject: [PATCH] Removed dst buffer delete responsibility from wxAnyValueType::CopyBuffer(), clarified documentation regarding it. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62198 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/any.h | 28 +++++++++++++++++----------- interface/wx/any.h | 13 ++++++++++--- src/common/any.cpp | 4 ++-- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/include/wx/any.h b/include/wx/any.h index 102f75926e..0784b66480 100644 --- a/include/wx/any.h +++ b/include/wx/any.h @@ -83,9 +83,14 @@ public: virtual void DeleteValue(wxAnyValueBuffer& buf) const = 0; /** - Implement this for buffer-to-buffer copy. src.m_ptr can - be expected to be NULL if value type of previously stored - data was different. + Implement this for buffer-to-buffer copy. + + @param src + This is the source data buffer. + + @param dst + This is the destination data buffer that is in either + uninitialized or freed state. */ virtual void CopyBuffer(const wxAnyValueBuffer& src, wxAnyValueBuffer& dst) const = 0; @@ -259,13 +264,11 @@ public: virtual void DeleteValue(wxAnyValueBuffer& buf) const { Ops::DeleteValue(buf); - buf.m_ptr = NULL; // This is important } virtual void CopyBuffer(const wxAnyValueBuffer& src, wxAnyValueBuffer& dst) const { - Ops::DeleteValue(dst); Ops::SetValue(Ops::GetValue(src), dst); } @@ -767,12 +770,15 @@ private: // Assignment functions void AssignAny(const wxAny& any) { - if ( !any.m_type->IsSameType(m_type) ) - { - m_type->DeleteValue(m_buffer); - m_type = any.m_type; - } - m_type->CopyBuffer(any.m_buffer, m_buffer); + // Must delete value - CopyBuffer() never does that + m_type->DeleteValue(m_buffer); + + wxAnyValueType* newType = any.m_type; + + if ( !newType->IsSameType(m_type) ) + m_type = newType; + + newType->CopyBuffer(any.m_buffer, m_buffer); } template diff --git a/interface/wx/any.h b/interface/wx/any.h index 5623c8d9e0..c1893fbfe6 100644 --- a/interface/wx/any.h +++ b/interface/wx/any.h @@ -321,6 +321,8 @@ union wxAnyValueBuffer wxAnyValueBuffer& dst) const { // TODO: Copy value from one buffer to another. + // dst is already uninitialized and does not + // need to be freed. } virtual bool ConvertValue(const wxAnyValueBuffer& src, @@ -394,9 +396,14 @@ public: wxAnyValueBuffer& dst) const = 0; /** - Implement this for buffer-to-buffer copy. src.m_ptr can - be expected to be NULL if value type of previously stored - data was different. + Implement this for buffer-to-buffer copy. + + @param src + This is the source data buffer. + + @param dst + This is the destination data buffer that is in either + uninitialized or freed state. */ virtual void CopyBuffer(const wxAnyValueBuffer& src, wxAnyValueBuffer& dst) const = 0; diff --git a/src/common/any.cpp b/src/common/any.cpp index 9ac859b6e1..01658ab8b7 100644 --- a/src/common/any.cpp +++ b/src/common/any.cpp @@ -354,12 +354,12 @@ class wxAnyValueTypeImpl : public wxAnyValueType { WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl) public: + // Dummy implementations virtual void DeleteValue(wxAnyValueBuffer& buf) const { - buf.m_ptr = NULL; // This is important + wxUnusedVar(buf); } - // Dummy implementations virtual void CopyBuffer(const wxAnyValueBuffer& src, wxAnyValueBuffer& dst) const { -- 2.45.2