fixed size of buffer returned by wxFormatConverter (it was too large before)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59939 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2009-03-30 11:54:41 +00:00
parent ee032c59df
commit a6bb7a282d
3 changed files with 36 additions and 4 deletions

View File

@@ -330,6 +330,17 @@ public:
return true; return true;
} }
void shrink(size_t len)
{
wxASSERT_MSG( this->m_data->m_owned, "cannot shrink non-owned buffer" );
wxASSERT_MSG( this->m_data->m_ref == 1, "can't shrink shared buffer" );
wxASSERT( len <= this->length() );
this->m_data->m_length = len;
this->data()[len] = 0;
}
}; };
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer<char> ) WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer<char> )

View File

@@ -200,8 +200,27 @@ public:
Can only be called on buffers that don't share data with another Can only be called on buffers that don't share data with another
buffer (i.e. reference count of the data is 1). buffer (i.e. reference count of the data is 1).
@see shrink()
*/ */
bool extend(size_t len); bool extend(size_t len);
/**
Shrinks the buffer to have size @a len and NUL-terminates the string
at this length.
Can only be called on buffers that don't share data with another
buffer (i.e. reference count of the data is 1).
@param len Length to shrink to. Must not be larger than current length.
@note The string is not reallocated to take less memory.
@since 2.9.0
@see extend()
*/
bool shrink(size_t len);
}; };
/** /**

View File

@@ -152,7 +152,7 @@ public:
m_nCopied = 0; m_nCopied = 0;
} }
wxCharTypeBuffer<CharType> Convert(const CharType *format) wxScopedCharTypeBuffer<CharType> Convert(const CharType *format)
{ {
// this is reset to NULL if we modify the format string // this is reset to NULL if we modify the format string
m_fmtOrig = format; m_fmtOrig = format;
@@ -263,12 +263,14 @@ public:
// format // format
if ( m_fmtOrig ) if ( m_fmtOrig )
{ {
return wxCharTypeBuffer<CharType>::CreateNonOwned(m_fmtOrig); return wxScopedCharTypeBuffer<CharType>::CreateNonOwned(m_fmtOrig);
} }
else else
{ {
// NULL-terminate converted format string: // shrink converted format string to actual size (instead of
*m_fmtLast = 0; // over-sized allocation from CopyAllBefore()) and NUL-terminate
// it:
m_fmt.shrink(m_fmtLast - m_fmt.data());
return m_fmt; return m_fmt;
} }
} }