#ifndef WX_PRECOMP
#include "wx/defs.h"
#include "wx/string.h"
+#include <wx/intl.h>
#endif
#include <ctype.h>
// allocating extra space for each string consumes more memory but speeds up
// the concatenation operations (nLen is the current string's length)
-#define EXTRA_ALLOC 16
+// NB: EXTRA_ALLOC must be >= 0!
+#define EXTRA_ALLOC (19 - nLen % 16)
// ---------------------------------------------------------------------------
// static class variables definition
~Averager()
{ printf("wxString: average %s = %f\n", m_sz, ((float)m_nTotal)/m_nCount); }
- void Add(uint n) { m_nTotal += n; m_nCount++; }
+ void Add(size_t n) { m_nTotal += n; m_nCount++; }
private:
- uint m_nCount, m_nTotal;
+ size_t m_nCount, m_nTotal;
const char *m_sz;
} g_averageLength("allocation size"),
g_averageSummandLength("summand length"),
wxString::wxString(const wchar_t *pwz)
{
// first get necessary size
- size_t nLen = wcstombs(NULL, pwz, 0);
+ size_t nLen = wcstombs((char *) NULL, pwz, 0);
// empty?
if ( nLen != 0 ) {
if ( pData->IsShared() ) {
pData->Unlock(); // memory not freed because shared
- uint nLen = pData->nDataLength;
+ size_t nLen = pData->nDataLength;
AllocBuffer(nLen);
memcpy(m_pchData, pData->data(), nLen*sizeof(char));
}
- wxASSERT( !pData->IsShared() ); // we must be the only owner
+ wxASSERT( !GetStringData()->IsShared() ); // we must be the only owner
}
// must be called before replacing contents of this string
}
// allocate enough memory for nLen characters
-void wxString::Alloc(uint nLen)
+void wxString::Alloc(size_t nLen)
{
wxStringData *pData = GetStringData();
if ( pData->nAllocLength <= nLen ) {
- if ( pData->IsEmpty() )
- AllocBuffer(nLen);
+ if ( pData->IsEmpty() ) {
+ nLen += EXTRA_ALLOC;
+
+ wxStringData* pData = (wxStringData*)
+ malloc(sizeof(wxStringData) + (nLen + 1)*sizeof(char));
+ pData->nRefs = 1;
+ pData->nDataLength = 0;
+ pData->nAllocLength = nLen;
+ m_pchData = pData->data(); // data starts after wxStringData
+ m_pchData[0u] = '\0';
+ }
else if ( pData->IsShared() ) {
pData->Unlock(); // memory not freed because shared
- uint nLen = pData->nDataLength;
+ size_t nOldLen = pData->nDataLength;
AllocBuffer(nLen);
- memcpy(m_pchData, pData->data(), nLen*sizeof(char));
+ memcpy(m_pchData, pData->data(), nOldLen*sizeof(char));
}
else {
nLen += EXTRA_ALLOC;
void wxString::Shrink()
{
wxStringData *pData = GetStringData();
- void *p = realloc(pData, sizeof(wxStringData) +
- (pData->nDataLength + 1)*sizeof(char));
+
+ // this variable is unused in release build, so avoid the compiler warning by
+ // just not declaring it
+#ifdef __WXDEBUG__
+ void *p =
+#endif
+ realloc(pData, sizeof(wxStringData) + (pData->nDataLength + 1)*sizeof(char));
+
wxASSERT( p != NULL ); // can't free memory?
wxASSERT( p == pData ); // we're decrementing the size - block shouldn't move!
}
// get the pointer to writable buffer of (at least) nLen bytes
-char *wxString::GetWriteBuf(uint nLen)
+char *wxString::GetWriteBuf(size_t nLen)
{
AllocBeforeWrite(nLen);
// so we don't waste our time checking for it
// if ( nSrcLen > 0 )
wxStringData *pData = GetStringData();
- uint nLen = pData->nDataLength;
- uint nNewLen = nLen + nSrcLen;
+ size_t nLen = pData->nDataLength;
+ size_t nNewLen = nLen + nSrcLen;
// alloc new buffer if current is too small
if ( pData->IsShared() ) {
}
// replace first (or all) occurences of some substring with another one
-uint wxString::Replace(const char *szOld, const char *szNew, bool bReplaceAll)
+size_t wxString::Replace(const char *szOld, const char *szNew, bool bReplaceAll)
{
- uint uiCount = 0; // count of replacements made
+ size_t uiCount = 0; // count of replacements made
- uint uiOldLen = Strlen(szOld);
+ size_t uiOldLen = Strlen(szOld);
wxString strTemp;
const char *pCurrent = m_pchData;
return TRUE;
// are there any other metacharacters in the mask?
- uint uiLenMask;
+ size_t uiLenMask;
const char *pEndMask = strpbrk(pszMask, "*?");
if ( pEndMask != NULL ) {
wxASSERT( str.GetStringData()->IsValid() );
wxASSERT( nPos <= Len() );
- wxString strTmp;
- char *pc = strTmp.GetWriteBuf(Len() + str.Len());
- strncpy(pc, c_str(), nPos);
- strcpy(pc + nPos, str);
- strcpy(pc + nPos + str.Len(), c_str() + nPos);
- strTmp.UngetWriteBuf();
- *this = strTmp;
+ if ( !str.IsEmpty() ) {
+ wxString strTmp;
+ char *pc = strTmp.GetWriteBuf(Len() + str.Len());
+ strncpy(pc, c_str(), nPos);
+ strcpy(pc + nPos, str);
+ strcpy(pc + nPos + str.Len(), c_str() + nPos);
+ strTmp.UngetWriteBuf();
+ *this = strTmp;
+ }
return *this;
}
{
m_nSize =
m_nCount = 0;
- m_pItems = NULL;
+ m_pItems = (char **) NULL;
}
// copy ctor
wxArrayString::wxArrayString(const wxArrayString& src)
{
- m_nSize = src.m_nSize;
- m_nCount = src.m_nCount;
-
- if ( m_nSize != 0 )
- m_pItems = new char *[m_nSize];
- else
- m_pItems = NULL;
+ m_nSize =
+ m_nCount = 0;
+ m_pItems = (char **) NULL;
- if ( m_nCount != 0 )
- memcpy(m_pItems, src.m_pItems, m_nCount*sizeof(char *));
+ *this = src;
}
-// copy operator
+// assignment operator
wxArrayString& wxArrayString::operator=(const wxArrayString& src)
{
- DELETEA(m_pItems);
+ if ( m_nSize > 0 )
+ Clear();
- m_nSize = src.m_nSize;
- m_nCount = src.m_nCount;
+ if ( src.m_nCount > ARRAY_DEFAULT_INITIAL_SIZE )
+ Alloc(src.m_nCount);
- if ( m_nSize != 0 )
- m_pItems = new char *[m_nCount];
- else
- m_pItems = NULL;
+ // we can't just copy the pointers here because otherwise we would share
+ // the strings with another array
+ for ( size_t n = 0; n < src.m_nCount; n++ )
+ Add(src[n]);
if ( m_nCount != 0 )
memcpy(m_pItems, src.m_pItems, m_nCount*sizeof(char *));
m_pItems = new char *[m_nSize];
}
else {
+ // otherwise when it's called for the first time, nIncrement would be 0
+ // and the array would never be expanded
+ wxASSERT( ARRAY_DEFAULT_INITIAL_SIZE != 0 );
+
// add 50% but not too much
- size_t nIncrement = m_nSize >> 1;
+ size_t nIncrement = m_nSize < ARRAY_DEFAULT_INITIAL_SIZE
+ ? ARRAY_DEFAULT_INITIAL_SIZE : m_nSize >> 1;
if ( nIncrement > ARRAY_MAXSIZE_INCREMENT )
nIncrement = ARRAY_MAXSIZE_INCREMENT;
m_nSize += nIncrement;
memcpy(pNew, m_pItems, m_nCount*sizeof(char *));
// delete old memory (but do not release the strings!)
- DELETEA(m_pItems);
+ wxDELETEA(m_pItems);
m_pItems = pNew;
}
m_nSize =
m_nCount = 0;
- DELETEA(m_pItems);
- m_pItems = NULL;
+ wxDELETEA(m_pItems);
}
// dtor
{
Free();
- DELETEA(m_pItems);
+ wxDELETEA(m_pItems);
}
// pre-allocates memory (frees the previous data!)
// only if old buffer was not big enough
if ( nSize > m_nSize ) {
Free();
- DELETEA(m_pItems);
+ wxDELETEA(m_pItems);
m_pItems = new char *[nSize];
m_nSize = nSize;
}
{
if ( bFromEnd ) {
if ( m_nCount > 0 ) {
- uint ui = m_nCount;
+ size_t ui = m_nCount;
do {
if ( STRING(m_pItems[--ui])->IsSameAs(sz, bCase) )
return ui;
}
}
else {
- for( uint ui = 0; ui < m_nCount; ui++ ) {
+ for( size_t ui = 0; ui < m_nCount; ui++ ) {
if( STRING(m_pItems[ui])->IsSameAs(sz, bCase) )
return ui;
}
{
wxASSERT( str.GetStringData()->IsValid() );
- wxCHECK_RET( nIndex <= m_nCount, "bad index in wxArrayString::Insert" );
+ wxCHECK_RET( nIndex <= m_nCount, ("bad index in wxArrayString::Insert") );
Grow();
// removes item from array (by index)
void wxArrayString::Remove(size_t nIndex)
{
- wxCHECK_RET( nIndex <= m_nCount, "bad index in wxArrayString::Remove" );
+ wxCHECK_RET( nIndex <= m_nCount, _("bad index in wxArrayString::Remove") );
// release our lock
Item(nIndex).GetStringData()->Unlock();
int iIndex = Index(sz);
wxCHECK_RET( iIndex != NOT_FOUND,
- "removing inexistent element in wxArrayString::Remove" );
+ _("removing inexistent element in wxArrayString::Remove") );
- Remove((size_t)iIndex);
+ Remove(iIndex);
}
// sort array elements using passed comparaison function
-void wxArrayString::Sort(bool bCase, bool bReverse)
+void wxArrayString::Sort(bool WXUNUSED(bCase), bool WXUNUSED(bReverse) )
{
//@@@@ TO DO
//qsort(m_pItems, m_nCount, sizeof(char *), fCmp);