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
This commit is contained in:
Jaakko Salli
2009-09-29 13:38:20 +00:00
parent d90443b8a2
commit 24985a9b5b
3 changed files with 29 additions and 16 deletions

View File

@@ -83,9 +83,14 @@ public:
virtual void DeleteValue(wxAnyValueBuffer& buf) const = 0; virtual void DeleteValue(wxAnyValueBuffer& buf) const = 0;
/** /**
Implement this for buffer-to-buffer copy. src.m_ptr can Implement this for buffer-to-buffer copy.
be expected to be NULL if value type of previously stored
data was different. @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, virtual void CopyBuffer(const wxAnyValueBuffer& src,
wxAnyValueBuffer& dst) const = 0; wxAnyValueBuffer& dst) const = 0;
@@ -259,13 +264,11 @@ public:
virtual void DeleteValue(wxAnyValueBuffer& buf) const virtual void DeleteValue(wxAnyValueBuffer& buf) const
{ {
Ops::DeleteValue(buf); Ops::DeleteValue(buf);
buf.m_ptr = NULL; // This is important
} }
virtual void CopyBuffer(const wxAnyValueBuffer& src, virtual void CopyBuffer(const wxAnyValueBuffer& src,
wxAnyValueBuffer& dst) const wxAnyValueBuffer& dst) const
{ {
Ops::DeleteValue(dst);
Ops::SetValue(Ops::GetValue(src), dst); Ops::SetValue(Ops::GetValue(src), dst);
} }
@@ -767,12 +770,15 @@ private:
// Assignment functions // Assignment functions
void AssignAny(const wxAny& any) void AssignAny(const wxAny& any)
{ {
if ( !any.m_type->IsSameType(m_type) ) // Must delete value - CopyBuffer() never does that
{
m_type->DeleteValue(m_buffer); m_type->DeleteValue(m_buffer);
m_type = any.m_type;
} wxAnyValueType* newType = any.m_type;
m_type->CopyBuffer(any.m_buffer, m_buffer);
if ( !newType->IsSameType(m_type) )
m_type = newType;
newType->CopyBuffer(any.m_buffer, m_buffer);
} }
template<typename T> template<typename T>

View File

@@ -321,6 +321,8 @@ union wxAnyValueBuffer
wxAnyValueBuffer& dst) const wxAnyValueBuffer& dst) const
{ {
// TODO: Copy value from one buffer to another. // 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, virtual bool ConvertValue(const wxAnyValueBuffer& src,
@@ -394,9 +396,14 @@ public:
wxAnyValueBuffer& dst) const = 0; wxAnyValueBuffer& dst) const = 0;
/** /**
Implement this for buffer-to-buffer copy. src.m_ptr can Implement this for buffer-to-buffer copy.
be expected to be NULL if value type of previously stored
data was different. @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, virtual void CopyBuffer(const wxAnyValueBuffer& src,
wxAnyValueBuffer& dst) const = 0; wxAnyValueBuffer& dst) const = 0;

View File

@@ -354,12 +354,12 @@ class wxAnyValueTypeImpl<wxAnyNullValue> : public wxAnyValueType
{ {
WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl<wxAnyNullValue>) WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl<wxAnyNullValue>)
public: public:
// Dummy implementations
virtual void DeleteValue(wxAnyValueBuffer& buf) const virtual void DeleteValue(wxAnyValueBuffer& buf) const
{ {
buf.m_ptr = NULL; // This is important wxUnusedVar(buf);
} }
// Dummy implementations
virtual void CopyBuffer(const wxAnyValueBuffer& src, virtual void CopyBuffer(const wxAnyValueBuffer& src,
wxAnyValueBuffer& dst) const wxAnyValueBuffer& dst) const
{ {