added ability to create 'non-owned' buffers that aren't freed by wxCharBuffer dtor

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45466 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2007-04-14 16:58:48 +00:00
parent 8237a1c052
commit 486a594182

View File

@@ -33,18 +33,32 @@ public:
typedef T CharType; typedef T CharType;
wxCharTypeBuffer(const CharType *str = NULL) wxCharTypeBuffer(const CharType *str = NULL)
: m_str(str ? wxStrDup(str) : NULL) : m_str(str ? wxStrDup(str) : NULL),
m_owned(true)
{ {
} }
wxCharTypeBuffer(size_t len) wxCharTypeBuffer(size_t len)
: m_str((CharType *)malloc((len + 1)*sizeof(CharType))) : m_str((CharType *)malloc((len + 1)*sizeof(CharType))),
m_owned(true)
{ {
m_str[len] = (CharType)0; m_str[len] = (CharType)0;
} }
static wxCharTypeBuffer CreateNonOwned(const CharType *str)
{
wxCharTypeBuffer buf;
buf.m_str = str;
buf.m_owned = false;
return buf;
}
/* no need to check for NULL, free() does it */ /* no need to check for NULL, free() does it */
~wxCharTypeBuffer() { free(m_str); } ~wxCharTypeBuffer()
{
if ( m_owned)
free(m_str);
}
/* /*
WARNING: WARNING:
@@ -55,7 +69,7 @@ public:
a) it shouldn't be really const a) it shouldn't be really const
b) you shouldn't use it afterwards (or know that it was reset) b) you shouldn't use it afterwards (or know that it was reset)
This is very ugly but is unfortunately needed to make the normal use\ This is very ugly but is unfortunately needed to make the normal use
of wxCharTypeBuffer buffer objects possible and is very similar to what of wxCharTypeBuffer buffer objects possible and is very similar to what
std::auto_ptr<> does (as if it were an excuse...) std::auto_ptr<> does (as if it were an excuse...)
*/ */
@@ -66,39 +80,43 @@ public:
*/ */
CharType *release() const CharType *release() const
{ {
CharType *p = m_str; wxASSERT_MSG( m_owned, _T("can't release non-owned buffer") );
((wxCharTypeBuffer *)this)->m_str = NULL; return DoRelease();
return p;
} }
void reset() void reset()
{ {
free(m_str); if ( m_owned )
free(m_str);
m_str = NULL; m_str = NULL;
} }
wxCharTypeBuffer(const wxCharTypeBuffer& src) wxCharTypeBuffer(const wxCharTypeBuffer& src)
: m_str(src.release())
{ {
CopyFrom(src);
} }
wxCharTypeBuffer& operator=(const CharType *str) wxCharTypeBuffer& operator=(const CharType *str)
{ {
free(m_str); if ( m_owned )
free(m_str);
m_str = str ? wxStrDup(str) : NULL; m_str = str ? wxStrDup(str) : NULL;
m_owned = true;
return *this; return *this;
} }
wxCharTypeBuffer& operator=(const wxCharTypeBuffer& src) wxCharTypeBuffer& operator=(const wxCharTypeBuffer& src)
{ {
free(m_str); if ( m_owned )
m_str = src.release(); free(m_str);
CopyFrom(src);
return *this; return *this;
} }
bool extend(size_t len) bool extend(size_t len)
{ {
wxASSERT_MSG( m_owned, _T("cannot extend non-owned buffer") );
CharType * CharType *
str = (CharType *)realloc(m_str, (len + 1)*sizeof(CharType)); str = (CharType *)realloc(m_str, (len + 1)*sizeof(CharType));
if ( !str ) if ( !str )
@@ -114,8 +132,24 @@ public:
operator const CharType *() const { return m_str; } operator const CharType *() const { return m_str; }
CharType operator[](size_t n) const { return m_str[n]; } CharType operator[](size_t n) const { return m_str[n]; }
private:
CharType *DoRelease() const
{
CharType *p = m_str;
((wxCharTypeBuffer *)this)->m_str = NULL;
return p;
}
void CopyFrom(const wxCharTypeBuffer& src)
{
m_owned = src.m_owned;
m_str = src.DoRelease();
}
private: private:
CharType *m_str; CharType *m_str;
bool m_owned;
}; };
class WXDLLIMPEXP_BASE wxCharBuffer : public wxCharTypeBuffer<char> class WXDLLIMPEXP_BASE wxCharBuffer : public wxCharTypeBuffer<char>