// Created: 29/01/98
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
/*
#ifndef _WX_WXSTRINGH__
#define _WX_WXSTRINGH__
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(__APPLE__)
#pragma interface "string.h"
#endif
// ----------------------------------------------------------------------------
// global pointer to empty string
-WXDLLEXPORT_DATA(extern const wxChar*) wxEmptyString;
+extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxEmptyString;
// ---------------------------------------------------------------------------
// global functions complementing standard C string library replacements for
#endif // OS/compiler
}
-#ifndef wxSnprintf
-// wxSnprintf() is like snprintf() if it's available and sprintf() (always
-// available, but dangerous!) if not.
-extern int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len,
- const wxChar *format,
- ...) ATTRIBUTE_PRINTF_3;
-#else
-// GNU libc 2.2 only has for wxSnprintf for Unicode called swprintf
-// so we imitate wxSprintf using it.
-extern int WXDLLEXPORT wxSprintf(wxChar *buf,
- const wxChar *format,
- ...) ATTRIBUTE_PRINTF_2;
-#endif
-
-#ifndef wxVsnprintf
-// and wxVsnprintf() is like vsnprintf() or vsprintf()
-extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len,
- const wxChar *format,
- va_list argptr);
-#else
-// GNU libc 2.2 only has for wxVsnprintf for Unicode called vswprintf
-// so we imitate wxVsprintf using it.
-extern int WXDLLEXPORT wxVsprintf(wxChar *buf,
- const wxChar *format,
- va_list argptr);
-#endif
-
// return an empty wxString
-class WXDLLEXPORT wxString; // not yet defined
+class WXDLLIMPEXP_BASE wxString; // not yet defined
inline const wxString& wxGetEmptyString() { return *(wxString *)&wxEmptyString; }
// ---------------------------------------------------------------------------
// is never used directly (but had to be put here to allow inlining)
// ---------------------------------------------------------------------------
-struct WXDLLEXPORT wxStringData
+struct WXDLLIMPEXP_BASE wxStringData
{
int nRefs; // reference count
size_t nDataLength, // actual string length
// lock/unlock
void Lock() { if ( !IsEmpty() ) nRefs++; }
- // VC++ will refuse to inline this function but profiling shows that it
- // is wrong
+ // VC++ will refuse to inline Unlock but profiling shows that it is wrong
#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
__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)
+#if defined(__VISUALC__) && defined(_MT) && !defined(_DLL)
+ void Unlock() { if ( !IsEmpty() && --nRefs == 0) Free(); }
+ // we must not inline deallocation since allocation is not inlined
+ void Free();
+#else
void Unlock() { if ( !IsEmpty() && --nRefs == 0) free(this); }
+#endif
// if we had taken control over string memory (GetWriteBuf), it's
// intentionally put in invalid state
// - regular expressions support
// ---------------------------------------------------------------------------
-class WXDLLEXPORT wxString
+class WXDLLIMPEXP_BASE wxString
{
-friend class WXDLLEXPORT wxArrayString;
+friend class WXDLLIMPEXP_BASE wxArrayString;
// NB: special care was taken in arranging the member functions in such order
// that all inline functions can be effectively inlined, verify that all
bool AssignCopy(size_t, const wxChar *);
// append a (sub)string
- bool ConcatSelf(int nLen, const wxChar *src);
+ bool ConcatSelf(size_t nLen, const wxChar *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)
// 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 = wxConvLibc, size_t nLength = wxSTRING_MAXLEN);
+ wxString(const char *psz, wxMBConv& conv, size_t nLength = wxSTRING_MAXLEN);
// from wxWCharBuffer (i.e. return from wxGetString)
wxString(const wxWCharBuffer& psz)
{ InitWith(psz, 0, wxSTRING_MAXLEN); }
// implicit conversion to C string
operator const wxChar*() const { return m_pchData; }
+
// explicit conversion to C string (use this with printf()!)
const wxChar* c_str() const { return m_pchData; }
- // identical to c_str()
+ // identical to c_str(), for wxWin 1.6x compatibility
const wxChar* wx_str() const { return m_pchData; }
- // identical to c_str()
+ // identical to c_str(), for MFC compatibility
const wxChar* GetData() const { return m_pchData; }
- // conversion to plain ascii: this is usefull for
- // converting numbers or strings which are certain
- // not to contain special chars (typically system
- // functions, X atoms, environment variables etc.)
+ // conversion to/from plain (i.e. 7 bit) ASCII: this is useful for
+ // converting numbers or strings which are certain not to contain special
+ // chars (typically system functions, X atoms, environment variables etc.)
+ //
+ // the behaviour of these functions with the strings containing anything
+ // else than 7 bit ASCII characters is undefined, use at your own risk.
#if wxUSE_UNICODE
- static wxString FromAscii( char *ascii );
+ static wxString FromAscii(const char *ascii); // string
+ static wxString FromAscii(const char ascii); // char
const wxCharBuffer ToAscii() const;
-#else
- static wxString FromAscii( char *ascii ) { return wxString( ascii ); }
- const char *ToAscii() const { return m_pchData; }
-#endif
+#else // ANSI
+ static wxString FromAscii(const char *ascii) { return wxString( ascii ); }
+ static wxString FromAscii(const char ascii) { return wxString( ascii ); }
+ const char *ToAscii() const { return c_str(); }
+#endif // Unicode/!Unicode
- // conversions with (possible) format convertions: have to return a
+ // conversions with (possible) format conversions: have to return a
// buffer with temporary data
//
// the functions defined (in either Unicode or ANSI) mode are mb_str() to
// non-destructive concatenation
//
- friend wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2);
+ friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, const wxString& string2);
//
- friend wxString WXDLLEXPORT operator+(const wxString& string, wxChar ch);
+ friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxChar ch);
//
- friend wxString WXDLLEXPORT operator+(wxChar ch, const wxString& string);
+ friend wxString WXDLLIMPEXP_BASE operator+(wxChar ch, const wxString& string);
//
- friend wxString WXDLLEXPORT operator+(const wxString& string, const wxChar *psz);
+ friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const wxChar *psz);
//
- friend wxString WXDLLEXPORT operator+(const wxChar *psz, const wxString& string);
+ friend wxString WXDLLIMPEXP_BASE operator+(const wxChar *psz, const wxString& string);
// stream-like functions
// insert an int into string
// standard types
typedef wxChar value_type;
+ typedef size_t size_type;
+ typedef value_type *iterator;
typedef const value_type *const_iterator;
// an 'invalid' value for string index
// returns true if the string is empty
bool empty() const { return IsEmpty(); }
// inform string about planned change in size
- void reserve(size_t size) { Alloc(size); }
+ void reserve(size_t sz) { Alloc(sz); }
// lib.string.access
// return the character at position n
// position one after the last valid one
const_iterator end() const { return wx_str() + length(); }
+ // first valid index position
+ iterator begin() { CopyBeforeWrite(); return m_pchData; }
+ // position one after the last valid one
+ iterator end() { CopyBeforeWrite(); return m_pchData + length(); }
+
// lib.string.modifiers
// append a string
wxString& append(const wxString& str)
// from the array (operator[] or Item() method), a reference is returned.
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxArrayString
+int WXDLLIMPEXP_BASE wxStringSortAscending(wxString*, wxString*);
+int WXDLLIMPEXP_BASE wxStringSortDescending(wxString*, wxString*);
+
+class WXDLLIMPEXP_BASE wxArrayString
{
public:
// type of function used by wxArrayString::Sort()
typedef int (*CompareFunction)(const wxString& first,
const wxString& second);
+ // type of function used by wxArrayString::Sort(), for compatibility with
+ // wxArray
+ typedef int (*CompareFunction2)(wxString* first,
+ wxString* second);
// constructors and destructor
// default ctor
return Item(Count() - 1);
}
+#if WXWIN_COMPATIBILITY_2_4
// return a wxString[], useful for the controls which
// take one in their ctor. You must delete[] it yourself
// once you are done with it. Will return NULL if the
// ArrayString was empty.
wxString* GetStringArray() const;
+#endif
// item management
// Search the element in the array, starting from the beginning if
// remove first item matching this value
void Remove(const wxChar *sz);
// remove item by index
- void Remove(size_t nIndex, size_t nRemove = 1);
- void RemoveAt(size_t nIndex, size_t nRemove = 1) { Remove(nIndex, nRemove); }
+#if WXWIN_COMPATIBILITY_2_4
+ void Remove(size_t nIndex, size_t nRemove = 1) { RemoveAt(nIndex, nRemove); }
+#endif
+ void RemoveAt(size_t nIndex, size_t nRemove = 1);
// sorting
// sort array elements in alphabetical order (or reversed alphabetical
void Sort(bool reverseOrder = FALSE);
// sort array elements using specified comparaison function
void Sort(CompareFunction compareFunction);
+ void Sort(CompareFunction2 compareFunction);
// comparison
// compare two arrays case sensitively
bool m_autoSort; // if TRUE, keep the array always sorted
};
-class WXDLLEXPORT wxSortedArrayString : public wxArrayString
+class WXDLLIMPEXP_BASE wxSortedArrayString : public wxArrayString
{
public:
wxSortedArrayString() : wxArrayString(TRUE)
// wxStringBuffer: a tiny class allowing to get a writable pointer into string
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxStringBuffer
+class WXDLLIMPEXP_BASE wxStringBuffer
{
- DECLARE_NO_COPY_CLASS(wxStringBuffer)
-
public:
wxStringBuffer(wxString& str, size_t lenWanted = 1024)
: m_str(str), m_buf(NULL)
{ m_buf = m_str.GetWriteBuf(lenWanted); }
-
+
~wxStringBuffer() { m_str.UngetWriteBuf(); }
-
+
operator wxChar*() const { return m_buf; }
-
+
private:
wxString& m_str;
wxChar *m_buf;
+
+ DECLARE_NO_COPY_CLASS(wxStringBuffer)
};
// ---------------------------------------------------------------------------
{ return (s2.Cmp((const char *)s1) != 0); }
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
-wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2);
-wxString WXDLLEXPORT operator+(const wxString& string, wxChar ch);
-wxString WXDLLEXPORT operator+(wxChar ch, const wxString& string);
-wxString WXDLLEXPORT operator+(const wxString& string, const wxChar *psz);
-wxString WXDLLEXPORT operator+(const wxChar *psz, const wxString& string);
+wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, const wxString& string2);
+wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxChar ch);
+wxString WXDLLIMPEXP_BASE operator+(wxChar ch, const wxString& string);
+wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const wxChar *psz);
+wxString WXDLLIMPEXP_BASE operator+(const wxChar *psz, const wxString& string);
#if wxUSE_UNICODE
inline wxString operator+(const wxString& string, const wxWCharBuffer& buf)
{ return string + (const wchar_t *)buf; }
#if defined(wxSTD_STRING_COMPATIBILITY) && wxUSE_STD_IOSTREAM
-#include "wx/ioswrap.h"
+#include "wx/iosfwrap.h"
-WXDLLEXPORT wxSTD istream& operator>>(wxSTD istream&, wxString&);
-WXDLLEXPORT wxSTD ostream& operator<<(wxSTD ostream&, const wxString&);
+WXDLLIMPEXP_BASE wxSTD istream& operator>>(wxSTD istream&, wxString&);
+WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxString&);
#endif // wxSTD_STRING_COMPATIBILITY