#ifdef HAVE_STRINGS_H
#include <strings.h> // for strcasecmp()
-#endif // AIX
+#endif // HAVE_STRINGS_H
#include "wx/defs.h" // everybody should include this
#include "wx/wxchar.h" // for wxChar
void CopyBeforeWrite();
void AllocBeforeWrite(size_t);
- // this method is not implemented - there is _no_ conversion from int to
+ // if we hadn't made these operators private, it would be possible to
+ // compile "wxString s; s = 17;" without any warnings as 17 is implicitly
+ // converted to char in C and we do have operator=(char)
+ //
+ // NB: we don't need other versions (short/long and unsigned) as attempt
+ // to assign another numeric type to wxString will now result in
+ // ambiguity between operator=(char) and operator=(int)
+ wxString& operator=(int);
+
+ // these methods are not implemented - there is _no_ conversion from int to
// string, you're doing something wrong if the compiler wants to call it!
//
// try `s << i' or `s.Printf("%d", i)' instead
wxString(int);
- wxString(unsigned int);
- wxString(long);
- wxString(unsigned long);
public:
// constructors and destructor
bool IsEmpty() const { return Len() == 0; }
// 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);
// empty string contents
void Empty()
{
- if ( !IsEmpty() )
- Reinit();
+ Truncate(0);
- // should be empty
- wxASSERT( GetStringData()->nDataLength == 0 );
+ wxASSERT_MSG( IsEmpty(), _T("string not empty after call to Empty()?") );
}
// empty the string and free memory
void Clear()
wxChar& Last()
{ wxASSERT( !IsEmpty() ); CopyBeforeWrite(); return m_pchData[Len()-1]; }
+ /*
+ So why do we have all these overloaded operator[]s? A bit of history:
+ initially there was only one of them, taking size_t. Then people
+ started complaining because they wanted to use ints as indices (I
+ wonder why) and compilers were giving warnings about it, so we had to
+ add the operator[](int). Then it became apparent that you couldn't
+ write str[0] any longer because there was ambiguity between two
+ overloads and so you now had to write str[0u] (or, of course, use the
+ explicit casts to either int or size_t but nobody did this).
+
+ Finally, someone decided to compile wxWin on an Alpha machine and got
+ a surprize: str[0u] didn't compile there because it is of type
+ unsigned int and size_t is unsigned _long_ on Alpha and so there was
+ ambiguity between converting uint to int or ulong. To fix this one we
+ now add operator[](uint) for the machines where size_t is not already
+ the same as unsigned int - hopefully this fixes the problem (for some
+ time)
+
+ The only real fix is, of course, to remove all versions but the one
+ taking size_t...
+ */
+
// operator version of GetChar
wxChar operator[](size_t n) const
{ ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
// operator version of GetChar
wxChar operator[](int n) const
{ ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
-#ifdef __alpha__
- // operator version of GetChar
- wxChar operator[](unsigned int n) const
- { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
-#endif
// operator version of GetWriteableChar
wxChar& operator[](size_t n)
{ ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
-#ifdef __alpha__
+
+#ifndef wxSIZE_T_IS_UINT
+ // operator version of GetChar
+ wxChar operator[](unsigned int n) const
+ { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
+
// operator version of GetWriteableChar
- wxChar& operator[](unsigned int n)
+ wxChar& operator[](unsigned int n)
{ ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
-#endif
+#endif // size_t != unsigned int
// implicit conversion to C string
operator const wxChar*() const { return m_pchData; }
wxString operator()(size_t start, size_t len) const
{ return Mid(start, len); }
- // check that the tring starts with prefix and return the rest of the
+ // 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
bool StartsWith(const wxChar *prefix, wxString *rest = NULL) const;
wxString Left(size_t nCount) const;
// get last nCount characters
wxString Right(size_t nCount) const;
- // get all characters before the first occurence of ch
+ // get all characters before the first occurance of ch
// (returns the whole string if ch not found)
wxString BeforeFirst(wxChar ch) const;
// get all characters before the last occurence of ch
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);
- // truncate string to given length
- wxString& Truncate(size_t uiLen);
// searching and replacing
// searching (return starting index, or -1 if not found)
// 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
// convert to a signed integer
- bool ToLong(long *val) const;
+ bool ToLong(long *val, int base = 0) const;
// convert to an unsigned integer
- bool ToULong(unsigned long *val) const;
+ bool ToULong(unsigned long *val, int base = 0) const;
// convert to a double
bool ToDouble(double *val) const;
wxString& append(size_t n, wxChar ch) { return Pad(n, ch); }
// same as `this_string = str'
- wxString& assign(const wxString& str) { return (*this) = str; }
+ wxString& assign(const wxString& str)
+ { return *this = str; }
// same as ` = str[pos..pos + n]
wxString& assign(const wxString& str, size_t pos, size_t n)
- { return *this = wxString((const wxChar *)str + pos, n); }
+ { Empty(); return Append(str.c_str() + pos, n); }
// same as `= first n (or all if n == npos) characters of sz'
wxString& assign(const wxChar *sz, size_t n = npos)
- { return *this = wxString(sz, n); }
+ { Empty(); return Append(sz, n == npos ? wxStrlen(sz) : n); }
// same as `= n copies of ch'
wxString& assign(size_t n, wxChar ch)
- { return *this = wxString(ch, n); }
+ { Empty(); return Append(ch, n); }
// insert another string
wxString& insert(size_t nPos, const wxString& str);
size_t Add(const wxString& str);
// add new element at given position
void Insert(const wxString& str, size_t uiIndex);
+ // expand the array to have count elements
+ void SetCount(size_t count);
// remove first item matching this value
void Remove(const wxChar *sz);
// remove item by index
{ Copy(array); }
};
+// ----------------------------------------------------------------------------
+// wxStringBuffer: a tiny class allowing to get a writable pointer into string
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStringBuffer
+{
+public:
+ wxStringBuffer(wxString& str, size_t lenWanted = 1024)
+ : m_str(str) { m_buf = m_str.GetWriteBuf(lenWanted); }
+
+ ~wxStringBuffer() { m_str.UngetWriteBuf(); }
+
+ operator wxChar*() const { return m_buf; }
+
+private:
+ wxString& m_str;
+ wxChar *m_buf;
+};
+
// ---------------------------------------------------------------------------
// wxString comparison functions: operator versions are always case sensitive
// ---------------------------------------------------------------------------
#include "wx/ioswrap.h"
-WXDLLEXPORT istream& operator>>(istream&, wxString&);
-WXDLLEXPORT ostream& operator<<(ostream&, const wxString&);
+WXDLLEXPORT wxSTD istream& operator>>(wxSTD istream&, wxString&);
+WXDLLEXPORT wxSTD ostream& operator<<(wxSTD ostream&, const wxString&);
#endif // wxSTD_STRING_COMPATIBILITY