///////////////////////////////////////////////////////////////////////////////
-// Name: string.h
+// Name: wx/string.h
// Purpose: wxString and wxArrayString classes
// Author: Vadim Zeitlin
// Modified by:
/*
Efficient string class [more or less] compatible with MFC CString,
- wxWindows version 1 wxString and std::string and some handy functions
+ wxWidgets version 1 wxString and std::string and some handy functions
missing from string.h.
*/
# include <stdlib.h>
#endif
-#ifdef HAVE_STRINGS_H
+#ifdef HAVE_STRCASECMP_IN_STRINGS_H
#include <strings.h> // for strcasecmp()
-#endif // HAVE_STRINGS_H
+#endif // HAVE_STRCASECMP_IN_STRINGS_H
#include "wx/wxchar.h" // for wxChar
#include "wx/buffer.h" // for wxCharBuffer
#include "wx/strconv.h" // for wxConvertXXX() macros and wxMBConv classes
+class WXDLLIMPEXP_BASE wxString;
+
// ---------------------------------------------------------------------------
// macros
// ---------------------------------------------------------------------------
return stricmp(psz1, psz2);
#elif defined(__WXPM__)
return stricmp(psz1, psz2);
-#elif defined(__UNIX__) || defined(__GNUWIN32__)
+#elif defined(HAVE_STRCASECMP_IN_STRING_H) || \
+ defined(HAVE_STRCASECMP_IN_STRINGS_H) || \
+ defined(__GNUWIN32__)
return strcasecmp(psz1, psz2);
#elif defined(__MWERKS__) && !defined(__INTEL__)
register char c1, c2;
#endif // OS/compiler
}
-// return an empty wxString
-class WXDLLIMPEXP_BASE wxString; // not yet defined
-inline const wxString& wxGetEmptyString() { return *(wxString *)&wxEmptyString; }
-
#if wxUSE_STL
#include "wx/beforestd.h"
// VC++ will refuse to inline Unlock but profiling shows that it is wrong
#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
- __forceinline
+ __forceinline
#endif
// VC++ free must take place in same DLL as allocation when using non dll
// run-time library (e.g. Multithreaded instead of Multithreaded DLL)
wxStringBase(const void *pStart, const void *pEnd);
// dtor is not virtual, this class must not be inherited from!
- ~wxStringBase()
- {
+ ~wxStringBase()
+ {
#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
- //RN - according to the above VC++ does indeed inline this,
- //even though it spits out two warnings
- #pragma warning (disable:4714)
+ //RN - according to the above VC++ does indeed inline this,
+ //even though it spits out two warnings
+ #pragma warning (disable:4714)
#endif
- GetStringData()->Unlock();
+ GetStringData()->Unlock();
}
#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
- //re-enable inlining warning
- #pragma warning (default:4714)
-#endif
+ //re-enable inlining warning
+ #pragma warning (default:4714)
+#endif
// overloaded assignment
// from another wxString
wxStringBase& operator=(const wxStringBase& stringSrc);
const_iterator end() const { return m_pchData + length(); }
// first valid index position
- iterator begin() { CopyBeforeWrite(); return m_pchData; }
+ iterator begin();
// position one after the last valid one
- iterator end() { CopyBeforeWrite(); return m_pchData + length(); }
+ iterator end();
// insert another string
wxStringBase& insert(size_t nPos, const wxStringBase& str)
wxStringBase& insert(size_t nPos, size_t n, wxChar ch)
{ return insert(nPos, wxStringBase(n, ch)); }
iterator insert(iterator it, wxChar ch)
- { size_t idx = it - begin(); insert(idx, 1, ch); return begin() + idx; }
+ { size_t idx = it - begin(); insert(idx, 1, ch); return begin() + idx; }
void insert(iterator it, const_iterator first, const_iterator last)
{ insert(it - begin(), first, last - first); }
void insert(iterator it, size_type n, wxChar ch)
// All compare functions return -1, 0 or 1 if the [sub]string is less,
// equal or greater than the compare() argument.
- // just like strcmp()
- int compare(const wxStringBase& str) const
- { return wxStrcmp(c_str(), str.c_str()); }
+ // comparison with another string
+ int compare(const wxStringBase& str) const;
// comparison with a substring
int compare(size_t nStart, size_t nLen, const wxStringBase& str) const;
// comparison of 2 substrings
int compare(size_t nStart, size_t nLen,
const wxStringBase& str, size_t nStart2, size_t nLen2) const;
- // just like strcmp()
- int compare(const wxChar* sz) const
- { return wxStrcmp(c_str(), sz); }
+ // comparison with a c string
+ int compare(const wxChar* sz) const;
// substring comparison with first nCount characters of sz
int compare(size_t nStart, size_t nLen,
const wxChar* sz, size_t nCount = npos) const;
#if wxUSE_UNICODE
// from multibyte string
- // (NB: nLength is right now number of Unicode characters, not
- // characters in psz! So try not to use it yet!)
wxString(const char *psz, wxMBConv& conv, size_t nLength = npos);
// from wxWCharBuffer (i.e. return from wxGetString)
wxString(const wxWCharBuffer& psz) : wxStringBase(psz.data()) { }
// from wxCharBuffer
wxString(const wxCharBuffer& psz)
- : wxStringBase(psz, npos) { }
+ : wxStringBase(psz) { }
#endif // Unicode/ANSI
// generic attributes & operations
size_t Len() const { return length(); }
// string contains any characters?
bool IsEmpty() const { return empty(); }
- // empty string is "FALSE", so !str will return TRUE
+ // empty string is "false", so !str will return true
bool operator!() const { return IsEmpty(); }
// truncate the string to given length
wxString& Truncate(size_t uiLen);
// type differs because a function may either return pointer to the buffer
// directly or have to use intermediate buffer for translation.
#if wxUSE_UNICODE
- const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const
- { return conv.cWC2MB(c_str()); }
+ const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const;
const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); }
const wxWX2MBbuf mbc_str() const { return mb_str(); }
#if wxUSE_WCHAR_T
- const wxWCharBuffer wc_str(wxMBConv& conv) const
- { return conv.cMB2WC(c_str()); }
+ const wxWCharBuffer wc_str(wxMBConv& conv) const;
#endif // wxUSE_WCHAR_T
const wxChar* fn_str() const { return c_str(); }
// string comparison
// case-sensitive comparison (returns a value < 0, = 0 or > 0)
- int Cmp(const wxChar *psz) const { return wxStrcmp(c_str(), psz); }
+ int Cmp(const wxChar *psz) const;
+ int Cmp(const wxString& s) const;
// same as Cmp() but not case-sensitive
- int CmpNoCase(const wxChar *psz) const { return wxStricmp(c_str(), psz); }
+ int CmpNoCase(const wxChar *psz) const;
+ int CmpNoCase(const wxString& s) const;
// test for the string equality, either considering case or not
// (if compareWithCase then the case matters)
- bool IsSameAs(const wxChar *psz, bool compareWithCase = TRUE) const
+ bool IsSameAs(const wxChar *psz, bool compareWithCase = true) const
{ return (compareWithCase ? Cmp(psz) : CmpNoCase(psz)) == 0; }
- // comparison with a signle character: returns TRUE if equal
- bool IsSameAs(wxChar c, bool compareWithCase = TRUE) const
+ // comparison with a signle character: returns true if equal
+ bool IsSameAs(wxChar c, bool compareWithCase = true) const
{
return (length() == 1) && (compareWithCase ? GetChar(0u) == c
: wxToupper(GetChar(0u)) == wxToupper(c));
// check that the string starts with prefix and return the rest of the
// string in the provided pointer if it is not NULL, otherwise return
- // FALSE
+ // false
bool StartsWith(const wxChar *prefix, wxString *rest = NULL) const;
// get first nCount characters
// trimming/padding whitespace (either side) and truncating
// remove spaces from left or from right (default) side
- wxString& Trim(bool bFromRight = TRUE);
+ wxString& Trim(bool bFromRight = true);
// add nCount copies chPad in the beginning or at the end (default)
- wxString& Pad(size_t nCount, wxChar chPad = wxT(' '), bool bFromRight = TRUE);
+ wxString& Pad(size_t nCount, wxChar chPad = wxT(' '), bool bFromRight = true);
// searching and replacing
// searching (return starting index, or -1 if not found)
- int Find(wxChar ch, bool bFromEnd = FALSE) const; // like strchr/strrchr
+ int Find(wxChar ch, bool bFromEnd = false) const; // like strchr/strrchr
// searching (return starting index, or -1 if not found)
int Find(const wxChar *pszSub) const; // like strstr
// replace first (or all of bReplaceAll) occurences of substring with
// another string, returns the number of replacements made
size_t Replace(const wxChar *szOld,
const wxChar *szNew,
- bool bReplaceAll = TRUE);
+ bool bReplaceAll = true);
// check if the string contents matches a mask containing '*' and '?'
bool Matches(const wxChar *szMask) const;
- // conversion to numbers: all functions return TRUE only if the whole
+ // conversion to numbers: all functions return true only if the whole
// string is a number and put the value of this number into the pointer
// provided, the base is the numeric base in which the conversion should be
// done and must be comprised between 2 and 36 or be 0 in which case the
void UngetWriteBuf(size_t nLen);
#endif
- // wxWindows version 1 compatibility functions
+ // wxWidgets version 1 compatibility functions
// use Mid()
wxString SubString(size_t from, size_t to) const
int First( const wxChar ch ) const { return Find(ch); }
int First( const wxChar* psz ) const { return Find(psz); }
int First( const wxString &str ) const { return Find(str); }
- int Last( const wxChar ch ) const { return Find(ch, TRUE); }
- bool Contains(const wxString& str) const { return Find(str) != -1; }
+ int Last( const wxChar ch ) const { return Find(ch, true); }
+ bool Contains(const wxString& str) const { return Find(str) != wxNOT_FOUND; }
// use IsEmpty()
bool IsNull() const { return IsEmpty(); }
: wxStringBase(str, nPos, nLen) { }
// take all characters from pStart to pEnd
wxString(const void *pStart, const void *pEnd)
- : wxStringBase((const char*)pStart, (const char*)pEnd) { }
+ : wxStringBase((const wxChar*)pStart, (const wxChar*)pEnd) { }
#if wxUSE_STL
wxString(const_iterator first, const_iterator last)
: wxStringBase(first, last) { }
wxString& insert(size_t nPos, size_t n, wxChar ch)
{ return (wxString&)wxStringBase::insert(nPos, n, ch); }
iterator insert(iterator it, wxChar ch)
- { return wxStringBase::insert(it, ch); }
+ { return wxStringBase::insert(it, ch); }
void insert(iterator it, const_iterator first, const_iterator last)
{ wxStringBase::insert(it, first, last); }
void insert(iterator it, size_type n, wxChar ch)
#include "wx/arrstr.h"
#endif
+#if wxUSE_STL
+ // return an empty wxString (not very useful with wxUSE_STL == 1)
+ inline const wxString wxGetEmptyString() { return wxString(); }
+#else // !wxUSE_STL
+ // return an empty wxString (more efficient than wxString() here)
+ inline const wxString& wxGetEmptyString()
+ {
+ return *(wxString *)&wxEmptyString;
+ }
+#endif // wxUSE_STL/!wxUSE_STL
+
// ----------------------------------------------------------------------------
// wxStringBuffer: a tiny class allowing to get a writable pointer into string
// ----------------------------------------------------------------------------