// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
-#ifndef __WXSTRINGH__
-#define __WXSTRINGH__
+#ifndef _WX_WXSTRINGH__
+#define _WX_WXSTRINGH__
#ifdef __GNUG__
#pragma interface "string.h"
// ----------------------------------------------------------------------------
// global pointer to empty string
-extern const char *g_szNul;
+WXDLLEXPORT_DATA(extern const char*) g_szNul;
// return an empty wxString
-class wxString; // not yet defined
+class WXDLLEXPORT wxString; // not yet defined
inline const wxString& wxGetEmptyString() { return *(wxString *)&g_szNul; }
// ---------------------------------------------------------------------------
struct WXDLLEXPORT wxStringData
{
int nRefs; // reference count
- uint nDataLength, // actual string length
+ size_t nDataLength, // actual string length
nAllocLength; // allocated memory size
// mimics declaration 'char data[nAllocLength]'
{
#endif //WXSTRING_IS_WXOBJECT
-friend class wxArrayString;
+friend class WXDLLEXPORT wxArrayString;
- // NB: this data must be here (before all other functions) to be sure that all
- // inline functions are really inlined by all compilers
+ // NB: special care was taken in arrangin the member functions in such order
+ // that all inline functions can be effectively inlined
private:
// points to data preceded by wxStringData structure with ref count info
char *m_pchData;
// accessor to string data
wxStringData* GetStringData() const { return (wxStringData*)m_pchData - 1; }
+ // string (re)initialization functions
+ // initializes the string to the empty value (must be called only from
+ // ctors, use Reinit() otherwise)
+ void Init() { m_pchData = (char *)g_szNul; }
+ // initializaes the string with (a part of) C-string
+ void InitWith(const char *psz, size_t nPos = 0, size_t nLen = STRING_MAXLEN);
+ // as Init, but also frees old data
+ void Reinit() { GetStringData()->Unlock(); Init(); }
+
+ // memory allocation
+ // allocates memory for string of lenght nLen
+ void AllocBuffer(size_t nLen);
+ // copies data to another string
+ void AllocCopy(wxString&, int, int) const;
+ // effectively copies data to string
+ void AssignCopy(size_t, const char *);
+
+ // append a (sub)string
+ void ConcatSelf(int nLen, const char *src);
+
+ // functions called before writing to the string: they copy it if there
+ // are other references to our data (should be the only owner when writing)
+ void CopyBeforeWrite();
+ void AllocBeforeWrite(size_t);
+
public:
/** @name constructors & dtor */
//@{
/// ctor for an empty string
- wxString();
+ wxString() { Init(); }
/// copy ctor
- wxString(const wxString& stringSrc);
+ wxString(const wxString& stringSrc)
+ {
+ wxASSERT( stringSrc.GetStringData()->IsValid() );
+
+ if ( stringSrc.IsEmpty() ) {
+ // nothing to do for an empty string
+ Init();
+ }
+ else {
+ m_pchData = stringSrc.m_pchData; // share same data
+ GetStringData()->Lock(); // => one more copy
+ }
+ }
/// string containing nRepeat copies of ch
wxString(char ch, size_t nRepeat = 1);
/// ctor takes first nLength characters from C string
- wxString(const char *psz, size_t nLength = STRING_MAXLEN);
+ // (default value of STRING_MAXLEN means take all the string)
+ wxString(const char *psz, size_t nLength = STRING_MAXLEN)
+ { InitWith(psz, 0, nLength); }
/// from C string (for compilers using unsigned char)
wxString(const unsigned char* psz, size_t nLength = STRING_MAXLEN);
/// from wide (UNICODE) string
wxString(const wchar_t *pwz);
/// dtor is not virtual, this class must not be inherited from!
- ~wxString();
+ ~wxString() { GetStringData()->Unlock(); }
//@}
/** @name generic attributes & operations */
//@{
/// as standard strlen()
- uint Len() const { return GetStringData()->nDataLength; }
+ size_t Len() const { return GetStringData()->nDataLength; }
/// string contains any characters?
bool IsEmpty() const { return Len() == 0; }
- /// reinitialize string (and free data!)
+ /// reinitialize string (and free memory)
void Empty()
{
- if ( GetStringData()->nDataLength != 0 )
+ if ( !IsEmpty() )
Reinit();
wxASSERT( GetStringData()->nDataLength == 0 );
/** @name string concatenation */
//@{
/** @name in place concatenation */
- //@{
- /// string += string
- void operator+=(const wxString& s) { (void)operator<<(s); }
- /// string += C string
- void operator+=(const char *psz) { (void)operator<<(psz); }
- /// string += char
- void operator+=(char ch) { (void)operator<<(ch); }
- //@}
/** @name concatenate and return the result
left to right associativity of << allows to write
things like "str << str1 << str2 << ..." */
wxString& operator<<(char ch) { ConcatSelf(1, &ch); return *this; }
//@}
+ //@{
+ /// string += string
+ void operator+=(const wxString& s) { (void)operator<<(s); }
+ /// string += C string
+ void operator+=(const char *psz) { (void)operator<<(psz); }
+ /// string += char
+ void operator+=(char ch) { (void)operator<<(ch); }
+ //@}
+
/** @name return resulting string */
//@{
///
- friend wxString operator+(const wxString& string1, const wxString& string2);
+ friend wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2);
///
- friend wxString operator+(const wxString& string, char ch);
+ friend wxString WXDLLEXPORT operator+(const wxString& string, char ch);
///
- friend wxString operator+(char ch, const wxString& string);
+ friend wxString WXDLLEXPORT operator+(char ch, const wxString& string);
///
- friend wxString operator+(const wxString& string, const char *psz);
+ friend wxString WXDLLEXPORT operator+(const wxString& string, const char *psz);
///
- friend wxString operator+(const char *psz, const wxString& string);
+ friend wxString WXDLLEXPORT operator+(const char *psz, const wxString& string);
//@}
//@}
/** @name string comparison */
//@{
/**
- case-sensitive comparaison
+ case-sensitive comparison
@return 0 if equal, +1 if greater or -1 if less
@see CmpNoCase, IsSameAs
*/
int Cmp(const char *psz) const { return strcmp(c_str(), psz); }
/**
- case-insensitive comparaison, return code as for wxString::Cmp()
+ case-insensitive comparison, return code as for wxString::Cmp()
@see: Cmp, IsSameAs
*/
int CmpNoCase(const char *psz) const { return Stricmp(c_str(), psz); }
@param bReplaceAll: global replace (default) or only the first occurence
@return the number of replacements made
*/
- uint Replace(const char *szOld, const char *szNew, bool bReplaceAll = TRUE);
+ size_t Replace(const char *szOld, const char *szNew, bool bReplaceAll = TRUE);
//@}
/// check if the string contents matches a mask containing '*' and '?'
//@{
/// ensure that string has space for at least nLen characters
// only works if the data of this string is not shared
- void Alloc(uint nLen);
+ void Alloc(size_t nLen);
/// minimize the string's memory
// only works if the data of this string is not shared
void Shrink();
Unget() *must* be called a.s.a.p. to put string back in a reasonable
state!
*/
- char *GetWriteBuf(uint nLen);
+ char *GetWriteBuf(size_t nLen);
/// call this immediately after GetWriteBuf() has been used
void UngetWriteBuf();
//@}
/// same as Cmp
inline int CompareTo(const char* psz, caseCompare cmp = exact) const
- { return cmp == exact ? Cmp(psz) : CmpNoCase(psz); }
+ { return cmp == exact ? Cmp(psz) : CmpNoCase(psz); }
/// same as Mid (substring extraction)
- inline wxString operator()(size_t start, size_t len) const { return Mid(start, len); }
+ inline wxString operator()(size_t start, size_t len) const
+ { return Mid(start, len); }
/// same as += or <<
inline wxString& Append(const char* psz) { return *this << psz; }
- inline wxString& Append(char ch, int count = 1) { wxString str(ch, count); (*this) += str; return *this; }
+ inline wxString& Append(char ch, int count = 1)
+ { wxString str(ch, count); (*this) += str; return *this; }
///
- wxString& Prepend(const wxString& str) { *this = str + *this; return *this; }
+ wxString& Prepend(const wxString& str)
+ { *this = str + *this; return *this; }
/// same as Len
size_t Length() const { return Len(); }
/// same as MakeLower
wxString& Remove(size_t pos) { return Truncate(pos); }
wxString& RemoveLast() { return Truncate(Len() - 1); }
- // Robert Roebling
-
wxString& Remove(size_t nStart, size_t nLen) { return erase( nStart, nLen ); }
- size_t First( const char ch ) const { return find(ch); }
- size_t First( const char* psz ) const { return find(psz); }
- size_t First( const wxString &str ) const { return find(str); }
+ int First( const char ch ) const { return Find(ch); }
+ int First( const char* psz ) const { return Find(psz); }
+ int First( const wxString &str ) const { return Find(str); }
- size_t Last( const char ch ) const { return rfind(ch,0); }
- size_t Last( const char* psz ) const { return rfind(psz,0); }
- size_t Last( const wxString &str ) const { return rfind(str,0); }
+ int Last( const char ch ) const { return Find(ch, TRUE); }
/// same as IsEmpty
bool IsNull() const { return IsEmpty(); }
/** @name constructors */
//@{
/// take nLen chars starting at nPos
- wxString(const wxString& s, size_t nPos, size_t nLen = npos);
+ wxString(const wxString& str, size_t nPos, size_t nLen = npos)
+ {
+ wxASSERT( str.GetStringData()->IsValid() );
+ InitWith(str.c_str(), nPos, nLen == npos ? 0 : nLen);
+ }
/// take all characters from pStart to pEnd
wxString(const void *pStart, const void *pEnd);
//@}
size_t find(char ch, size_t nStart = 0) const;
// wxWin compatibility
- inline bool Contains(const wxString& str) { return Find(str) != -1; }
+ inline bool Contains(const wxString& str) const { return Find(str) != -1; }
//@}
//@{
/// just like strcmp()
int compare(const wxString& str) const { return Cmp(str); }
- /// comparaison with a substring
+ /// comparison with a substring
int compare(size_t nStart, size_t nLen, const wxString& str) const;
- /// comparaison of 2 substrings
+ /// comparison of 2 substrings
int compare(size_t nStart, size_t nLen,
const wxString& str, size_t nStart2, size_t nLen2) const;
/// just like strcmp()
int compare(const char* sz) const { return Cmp(sz); }
- /// substring comparaison with first nCount characters of sz
+ /// substring comparison with first nCount characters of sz
int compare(size_t nStart, size_t nLen,
const char* sz, size_t nCount = npos) const;
//@}
wxString substr(size_t nStart = 0, size_t nLen = npos) const;
//@}
#endif
-
-private:
-
-
- // string (re)initialization functions
- // initializes the string to the empty value (must be called only from
- // ctors, use Reinit() otherwise)
- void Init() { m_pchData = (char *)g_szNul; }
- // initializaes the string with (a part of) C-string
- void InitWith(const char *psz, size_t nPos = 0, size_t nLen = STRING_MAXLEN);
- // as Init, but also frees old data
- void Reinit() { GetStringData()->Unlock(); Init(); }
-
- // memory allocation
- // allocates memory for string of lenght nLen
- void AllocBuffer(size_t nLen);
- // copies data to another string
- void AllocCopy(wxString&, int, int) const;
- // effectively copies data to string
- void AssignCopy(size_t, const char *);
-
- // append a (sub)string
- void ConcatCopy(int nLen1, const char *src1, int nLen2, const char *src2);
- void ConcatSelf(int nLen, const char *src);
-
- // functions called before writing to the string: they copy it if there
- // other references (should be the only owner when writing)
- void CopyBeforeWrite();
- void AllocBeforeWrite(size_t);
};
// ----------------------------------------------------------------------------
@memo probably the most commonly used array type - array of strings
*/
// ----------------------------------------------------------------------------
-class wxArrayString
+class WXDLLEXPORT wxArrayString
{
public:
/** @name ctors and dtor */
/** @name simple accessors */
//@{
/// number of elements in the array
- uint Count() const { return m_nCount; }
+ size_t Count() const { return m_nCount; }
/// is it empty?
bool IsEmpty() const { return m_nCount == 0; }
//@}
/**
Search the element in the array, starting from the either side
@param if bFromEnd reverse search direction
- @param if bCase, comparaison is case sensitive (default)
+ @param if bCase, comparison is case sensitive (default)
@return index of the first item matched or NOT_FOUND
@see NOT_FOUND
*/
/// add new element at the end
void Add (const wxString& str);
/// add new element at given position
- void Insert(const wxString& str, uint uiIndex);
+ void Insert(const wxString& str, size_t uiIndex);
/// remove first item matching this value
void Remove(const char *sz);
/// remove item by index
void Grow(); // makes array bigger if needed
void Free(); // free the string stored
- size_t m_nSize, // current size of the array
+ size_t m_nSize, // current size of the array
m_nCount; // current number of elements
char **m_pItems; // pointer to data
};
// ---------------------------------------------------------------------------
-// implementation of inline functions
-// ---------------------------------------------------------------------------
-
-// Put back into class, since BC++ can't create precompiled header otherwise
-
-// ---------------------------------------------------------------------------
-/** @name wxString comparaison functions
- @memo Comparaisons are case sensitive
+/** @name wxString comparison functions
+ @memo Comparisons are case sensitive
*/
// ---------------------------------------------------------------------------
//@{
///
inline bool operator>=(const char * s1, const wxString& s2) { return s2.Cmp(s1) <= 0; }
//@}
+wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2);
+wxString WXDLLEXPORT operator+(const wxString& string, char ch);
+wxString WXDLLEXPORT operator+(char ch, const wxString& string);
+wxString WXDLLEXPORT operator+(const wxString& string, const char *psz);
+wxString WXDLLEXPORT operator+(const char *psz, const wxString& string);
// ---------------------------------------------------------------------------
/** @name Global functions complementing standard C string library
#ifdef STD_STRING_COMPATIBILITY
// fwd decl
-class WXDLLEXPORT istream;
+// Known not to work with wxUSE_IOSTREAMH set to 0, so
+// replacing with includes (on advice of ungod@pasdex.com.au)
+// class WXDLLEXPORT istream;
+#if wxUSE_IOSTREAMH
+// N.B. BC++ doesn't have istream.h, ostream.h
+#include <iostream.h>
+#else
+#include <istream>
+# ifdef _MSC_VER
+ using namespace std;
+# endif
+#endif
istream& WXDLLEXPORT operator>>(istream& is, wxString& str);
#endif //std::string compatibility
-#endif // __WXSTRINGH__
+#endif // _WX_WXSTRINGH__
//@}