From 727aa9062ba6ffa3153069e15df38dca958172d5 Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Sat, 6 Dec 2008 16:24:52 +0000 Subject: [PATCH] moved many things from wxString reference page to the wxString overview; updated some old/incoherent informations; added some DIA-drawn graphs showing UTF8/UCS2 different representation used by wxString git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57140 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- .../doxygen/images/overview_unicode_codes.dia | Bin 0 -> 1783 bytes .../doxygen/images/overview_unicode_codes.png | Bin 7414 -> 15933 bytes .../images/overview_wxstring_encoding.dia | Bin 0 -> 4485 bytes .../images/overview_wxstring_encoding.png | Bin 0 -> 64212 bytes docs/doxygen/overviews/mbconvclasses.h | 2 + docs/doxygen/overviews/string.h | 202 ++++++++++++--- docs/doxygen/overviews/unicode.h | 29 ++- interface/wx/string.h | 229 +++++++++--------- 8 files changed, 293 insertions(+), 169 deletions(-) create mode 100644 docs/doxygen/images/overview_unicode_codes.dia create mode 100644 docs/doxygen/images/overview_wxstring_encoding.dia create mode 100644 docs/doxygen/images/overview_wxstring_encoding.png diff --git a/docs/doxygen/images/overview_unicode_codes.dia b/docs/doxygen/images/overview_unicode_codes.dia new file mode 100644 index 0000000000000000000000000000000000000000..e8bd50f9886e88786473734eda523315913bceba GIT binary patch literal 1783 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 ZcG2|W@xru0yZ}y+k&>58leqQx{{TiR*Vq66 literal 7414 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 H-va(0i5W)8 diff --git a/docs/doxygen/images/overview_wxstring_encoding.dia b/docs/doxygen/images/overview_wxstring_encoding.dia new file mode 100644 index 0000000000000000000000000000000000000000..4d42a4a1a033ed2c737c5121e31d3cbf7051e8ed GIT binary patch literal 4485 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 Xz3L11@1jVr-tPS$|8z?)P@e$+-s997 literal 0 HcmV?d00001 diff --git a/docs/doxygen/images/overview_wxstring_encoding.png b/docs/doxygen/images/overview_wxstring_encoding.png new file mode 100644 index 0000000000000000000000000000000000000000..f81af5d1a2781f63920c5cfbabe9dd63e521452e GIT binary patch literal 64212 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 z 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 @@ -24,25 +26,104 @@ Classes: wxString, wxArrayString, wxStringTokenizer @section overview_string_intro Introduction -wxString is a class which represents a character string of arbitrary length and -containing arbitrary characters. The ASCII NUL character is allowed, but be -aware that in the current string implementation some methods might not work -correctly in this case. +wxString is a class which represents a Unicode string of arbitrary length and +containing arbitrary characters. -Since wxWidgets 3.0 wxString internally uses UCS-2 (basically 2-byte per -character wchar_t) under Windows and UTF-8 under Unix, Linux and -OS X to store its content. Much work has been done to make -existing code using ANSI string literals work as before. +The @c NUL character is allowed, but be +aware that in the current string implementation some methods might not work +correctly in this case. @todo still true? This class has all the standard operations you can expect to find in a string class: dynamic memory management (string extends to accommodate new -characters), construction from other strings, C strings, wide character C strings +characters), construction from other strings, C strings, wide character C strings and characters, assignment operators, access to individual characters, string -concatenation and comparison, substring extraction, case conversion, trimming and padding (with -spaces), searching and replacing and both C-like @c printf (wxString::Printf) +concatenation and comparison, substring extraction, case conversion, trimming and +padding (with spaces), searching and replacing and both C-like @c printf (wxString::Printf) and stream-like insertion functions as well as much more - see wxString for a list of all functions. +The wxString class has been completely rewritten for wxWidgets 3.0 but much work +has been done to make existing code using ANSI string literals work as it did +in previous versions. + + +@section overview_string_internal Internal wxString encoding + +Since wxWidgets 3.0 wxString internally uses UCS-2 (with Unicode +code units stored in @c wchar_t) under Windows and UTF-8 (with Unicode +code units stored in @c char) under Unix, Linux and Mac OS X to store its content. + +For definitions of code units and code points terms, please +see the @ref overview_unicode_encodings paragraph. + +Note that there is a difference about UCS-2 and UTF-16: the first is a fixed-length +encoding, without surrogate pairs, while the latter is a +variable-length encoding. Except for this the two encodings are identical. + +For simplicity of implementation, wxString when wxUSE_UNICODE_WCHAR==1 +(e.g. on Windows) uses UCS-2 and thus doesn't know anything about surrogate pairs; +it always consider 1 code unit per 1 code point, while this is really true only for +characters in the @e BMP (Basic Multilingual Plane). +Thus when iterating over a UTF-16 string stored in a wxString under Windows, the user +code has to take care of surrogate pair handling himself. +(Note however that Windows itself has built-in support for surrogate pairs in UTF-16, +such as for drawing strings on screen.) + +When instead wxUSE_UNICODE_UTF8==1 (e.g. on Linux and Mac OS X) +wxString handles UTF8 multi-bytes sequences just fine, so that you can use +UTF8 in a completely transparent way: + +Example: +@code + // first test, using exotic characters outside of the Unicode BMP: + + wxString test = wxString::FromUTF8("\xF0\x90\x8C\x80"); + // U+10300 is "OLD ITALIC LETTER A" and is part of Unicode Plane 1 + // in UTF8 it's encoded as 0xF0 0x90 0x8C 0x80 + + // it's a single Unicode code-point encoded as: + // - a UTF16 surrogate pair under Windows + // - a UTF8 multiple-bytes sequence under Linux + // (without considering the final NULL) + + wxPrintf("wxString reports a length of %d character(s)", test.length()); + // prints "wxString reports a length of 1 character(s)" on Linux + // prints "wxString reports a length of 2 character(s)" on Windows + // since Windows doesn't have surrogate pairs support! + + + // second test, this time using characters part of the Unicode BMP: + + wxString test2 = wxString::FromUTF8("\x41\xC3\xA0\xE2\x82\xAC"); + // this is the UTF8 encoding of capital letter A followed by + // 'small case letter a with grave' followed by the 'euro sign' + + // they are 3 Unicode code-points encoded as: + // - 3 UTF16 code units under Windows + // - 6 UTF8 code units under Linux + // (without considering the final NULL) + + wxPrintf("wxString reports a length of %d character(s)", test2.length()); + // prints "wxString reports a length of 3 character(s)" on Linux + // prints "wxString reports a length of 3 character(s)" on Windows +@endcode + +To better explain what stated above, consider the second string of the example +above; it's composed by 3 characters and the final @c NULL: + +@image html overview_wxstring_encoding.png + +As you can see, UCS2/UTF16 encoding is straightforward (for characters in the @e BMP) +and in this example the UCS2-encoded wxString takes 8 bytes. +UTF8 encoding is more elaborated and in this example takes 7 bytes. + +The type used by wxString to store Unicode code units is called wxStringCharType. + +In general, for strings containing many latin characters UTF8 provides a big +advantage in memory footprint respect UTF16, but requires some more processing +for common operations like e.g. length calculation. + + @section overview_string_comparison Comparison to Other String Classes @@ -50,52 +131,53 @@ The advantages of using a special string class instead of working directly with C strings are so obvious that there is a huge number of such classes available. The most important advantage is the need to always remember to allocate/free memory for C strings; working with fixed size buffers almost inevitably leads -to buffer overflows. At last, C++ has a standard string class (std::string). So +to buffer overflows. At last, C++ has a standard string class (@c std::string). So why the need for wxString? There are several advantages: -@li Efficiency: Since wxWidgets 3.0 wxString uses std::string (UTF8 - mode under Linux, Unix and OS X) or std::wstring (MSW) internally by - default to store its constent. wxString will therefore inherit the - performance characteristics from std::string. +@li Efficiency: Since wxWidgets 3.0 wxString uses @c std::string (in UTF8 + mode under Linux, Unix and OS X) or @c std::wstring (in UTF16 mode under Windows) + internally by default to store its contents. wxString will therefore inherit the + performance characteristics from @c std::string. @li Compatibility: This class tries to combine almost full compatibility - with the old wxWidgets 1.xx wxString class, some reminiscence to MFC - CString class and 90% of the functionality of std::string class. -@li Rich set of functions: Some of the functions present in wxString are very - useful but don't exist in most of other string classes: for example, - wxString::AfterFirst, wxString::BeforeLast, wxString::operators or - wxString::Printf. Of course, all the standard string operations are - supported as well. -@li Unicode wxString is Unicode friendly: it allows to easily convert to - and from ANSI and Unicode strings (see the @ref overview_unicode "unicode overview" - for more details) and maps to @c wstring transparently. + with the old wxWidgets 1.xx wxString class, some reminiscence of MFC's + CString class and 90% of the functionality of @c std::string class. +@li Rich set of functions: Some of the functions present in wxString are + very useful but don't exist in most of other string classes: for example, + wxString::AfterFirst, wxString::BeforeLast, wxString::Printf. + Of course, all the standard string operations are supported as well. +@li wxString is Unicode friendly: it allows to easily convert to + and from ANSI and Unicode strings (see @ref overview_unicode + for more details) and maps to @c std::wstring transparently. @li Used by wxWidgets: And, of course, this class is used everywhere inside wxWidgets so there is no performance loss which would result from - conversions of objects of any other string class (including std::string) to + conversions of objects of any other string class (including @c std::string) to wxString internally by wxWidgets. However, there are several problems as well. The most important one is probably that there are often several functions to do exactly the same thing: for example, to get the length of the string either one of wxString::length(), wxString::Len() or wxString::Length() may be used. The first function, as -almost all the other functions in lowercase, is std::string compatible. The +almost all the other functions in lowercase, is @c std::string compatible. The second one is the "native" wxString version and the last one is the wxWidgets 1.xx way. -So which is better to use? The usage of the std::string compatible functions is +So which is better to use? The usage of the @c std::string compatible functions is strongly advised! It will both make your code more familiar to other C++ -programmers (who are supposed to have knowledge of std::string but not of +programmers (who are supposed to have knowledge of @c std::string but not of wxString), let you reuse the same code in both wxWidgets and other programs (by -just typedefing wxString as std::string when used outside wxWidgets) and by +just typedefing wxString as @c std::string when used outside wxWidgets) and by staying compatible with future versions of wxWidgets which will probably start -using std::string sooner or later too. +using @c std::string sooner or later too. -In the situations where there is no corresponding std::string function, please +In the situations where there is no corresponding @c std::string function, please try to use the new wxString methods and not the old wxWidgets 1.xx variants which are deprecated and may disappear in future versions. @section overview_string_advice Advice About Using wxString +@subsection overview_string_implicitconv Implicit conversions + Probably the main trap with using this class is the implicit conversion operator to const char*. It is advised that you use wxString::c_str() instead to clearly indicate when the conversion is done. Specifically, the @@ -124,8 +206,8 @@ because the argument of @c puts() is known to be of the type const char*, this is @b not done for @c printf() which is a function with variable number of arguments (and whose arguments are of unknown types). So this call may do any number of things (including displaying the correct -string on screen), although the most likely result is a program crash. The -solution is to use wxString::c_str(). Just replace this line with this: +string on screen), although the most likely result is a program crash. +The solution is to use wxString::c_str(). Just replace this line with this: @code printf("Hello, %s!\n", output.c_str()); @@ -138,10 +220,43 @@ its contents are completely arbitrary. The solution to this problem is also easy, just make the function return wxString instead of a C string. This leads us to the following general advice: all functions taking string -arguments should take const wxString (this makes assignment to the +arguments should take const wxString& (this makes assignment to the strings inside the function faster) and all functions returning strings should return wxString - this makes it safe to return local variables. +Finally note that wxString uses the current locale encoding to convert any C string +literal to Unicode. The same is done for converting to and from @c std::string +and for the return value of c_str(). +For this conversion, the @a wxConvLibc class instance is used. +See wxCSConv and wxMBConv. + + +@subsection overview_string_iterating Iterating wxString's characters + +As previously described, when wxUSE_UNICODE_UTF8==1, wxString internally +uses the variable-length UTF8 encoding. +Accessing a UTF-8 string by index can be very @b inefficient because +a single character is represented by a variable number of bytes so that +the entire string has to be parsed in order to find the character. +Since iterating over a string by index is a common programming technique and +was also possible and encouraged by wxString using the access operator[]() +wxString implements caching of the last used index so that iterating over +a string is a linear operation even in UTF-8 mode. + +It is nonetheless recommended to use @b iterators (instead of index based +access) like this: + +@code +wxString s = "hello"; +wxString::const_iterator i; +for (i = s.begin(); i != s.end(); ++i) +{ + wxUniChar uni_ch = *i; + // do something with it +} +@endcode + + @section overview_string_related String Related Functions and Classes @@ -158,7 +273,7 @@ these problems: wxIsEmpty() verifies whether the string is empty (returning case-insensitive string comparison function known either as @c stricmp() or @c strcasecmp() on different platforms. -The @ header also defines wxSnprintf and wxVsnprintf +The @ header also defines ::wxSnprintf and ::wxVsnprintf functions which should be used instead of the inherently dangerous standard @c sprintf() and which use @c snprintf() instead which does buffer size checks whenever possible. Of course, you may also use wxString::Printf which is also @@ -180,7 +295,7 @@ wxStrings. @note This section is strictly about performance issues and is absolutely not necessary to read for using wxString class. Please skip it unless you feel -familiar with profilers and relative tools. +familiar with profilers and relative tools. For the performance reasons wxString doesn't allocate exactly the amount of memory needed for each string. Instead, it adds a small amount of space to each @@ -244,5 +359,16 @@ really consider fine tuning wxString for your application). It goes without saying that a profiler should be used to measure the precise difference the change to @c EXTRA_ALLOC makes to your program. + +@section overview_string_settings wxString Related Compilation Settings + +Much work has been done to make existing code using ANSI string literals +work as before version 3.0. +If you nonetheless need to have a wxString that uses @c wchar_t +on Unix and Linux, too, you can specify this on the command line with the +@c configure @c --disable-utf8 switch or you can consider using wxUString +or @c std::wstring instead. + + */ diff --git a/docs/doxygen/overviews/unicode.h b/docs/doxygen/overviews/unicode.h index e372007b1e..e50454a1cd 100644 --- a/docs/doxygen/overviews/unicode.h +++ b/docs/doxygen/overviews/unicode.h @@ -49,30 +49,34 @@ other services should be ready to deal with Unicode. When working with Unicode, it's important to define the meaning of some terms. -A @e glyph is a particular image that represents a @e character or part of a character. +A glyph is a particular image that represents a character or part +of a character. Any character may have one or more glyph associated; e.g. some of the possible glyphs for the capital letter 'A' are: @image html overview_unicode_glyphs.png Unicode assigns each character of almost any existing alphabet/script a number, -which is called code point; it's typically indicated in documentation +which is called code point; it's typically indicated in documentation manuals and in the Unicode website as @c U+xxxx where @c xxxx is an hexadecimal number. The Unicode standard divides the space of all possible code points in @e planes; a plane is a range of 65,536 (1000016) contiguous Unicode code points. Planes are numbered from 0 to 16, where the first one is the @e BMP, or Basic Multilingual Plane. +The BMP contains characters for all modern languages, and a large number of +special characters. The other planes in fact contain mainly historic scripts, +special-purpose characters or are unused. Code points are represented in computer memory as a sequence of one or more -code units, where a code unit is a unit of memory: 8, 16, or 32 bits. +code units, where a code unit is a unit of memory: 8, 16, or 32 bits. More precisely, a code unit is the minimal bit combination that can represent a unit of encoded text for processing or interchange. The @e UTF or Unicode Transformation Formats are algorithms mapping the Unicode code points to code unit sequences. The simplest of them is UTF-32 where -each code unit is composed by 32 bits (4 bytes) and each code point is represented -by a single code unit. +each code unit is composed by 32 bits (4 bytes) and each code point is always +represented by a single code unit (fixed length encoding). (Note that even UTF-32 is still not completely trivial as the mapping is different for little and big-endian architectures). UTF-32 is commonly used under Unix systems for internal representation of Unicode strings. @@ -81,6 +85,7 @@ Another very widespread standard is UTF-16 which is used by Microsoft Win it encodes the first (approximately) 64 thousands of Unicode code points (the BMP plane) using 16-bit code units (2 bytes) and uses a pair of 16-bit code units to encode the characters beyond this. These pairs are called @e surrogate. +Thus UTF16 uses a variable number of code units to encode each code point. Finally, the most widespread encoding used for the external Unicode storage (e.g. files and network protocols) is UTF-8 which is byte-oriented and so @@ -107,7 +112,7 @@ Typically when UTF8 is used, code units are stored into @c char types, since @c char are 8bit wide on almost all systems; when using UTF16 typically code units are stored into @c wchar_t types since @c wchar_t is at least 16bits on all systems. This is also the approach used by wxString. -See @ref overview_wxstring for more info. +See @ref overview_string for more info. See also http://unicode.org/glossary/ for the official definitions of the terms reported above. @@ -123,8 +128,8 @@ programs require the Microsoft Layer for Unicode to run on Windows 95/98/ME. However, unlike the Unicode build mode of the previous versions of wxWidgets, this support is mostly transparent: you can still continue to work with the @b narrow -(i.e. current-locale-encoded @c char*) strings even if @b wide -(i.e. UTF16/UCS2-encoded @c wchar_t* or UTF8-encoded @c char) strings are also +(i.e. current locale-encoded @c char*) strings even if @b wide +(i.e. UTF16/UCS2-encoded @c wchar_t* or UTF8-encoded @c char*) strings are also supported. Any wxWidgets function accepts arguments of either type as both kinds of strings are implicitly converted to wxString, so both @code @@ -132,7 +137,7 @@ wxMessageBox("Hello, world!"); @endcode and the somewhat less usual @code -wxMessageBox(L"Salut \u00e0 toi!"); // 00E0 is "Latin Small Letter a with Grave" +wxMessageBox(L"Salut \u00E0 toi!"); // U+00E0 is "Latin Small Letter a with Grave" @endcode work as expected. @@ -147,9 +152,10 @@ in the case of gcc). In particular, the most common encoding used under modern Unix systems is UTF-8 and as the string above is not a valid UTF-8 byte sequence, nothing would be displayed at all in this case. Thus it is important to never use 8-bit (instead of 7-bit) characters directly in the program source -but use wide strings or, alternatively, write +but use wide strings or, alternatively, write: @code -wxMessageBox(wxString::FromUTF8("Salut \xc3\xa0 toi!")); +wxMessageBox(wxString::FromUTF8("Salut \xC3\xA0 toi!")); + // in UTF8 the character U+00E0 is encoded as 0xC3A0 @endcode In a similar way, wxString provides access to its contents as either @c wchar_t or @@ -327,6 +333,7 @@ different encoding of it. So you need to be able to convert the data to various representations and the wxString methods wxString::ToAscii(), wxString::ToUTF8() (or its synonym wxString::utf8_str()), wxString::mb_str(), wxString::c_str() and wxString::wc_str() can be used for this. + The first of them should be only used for the string containing 7-bit ASCII characters only, anything else will be replaced by some substitution character. wxString::mb_str() converts the string to the encoding used by the current locale diff --git a/interface/wx/string.h b/interface/wx/string.h index ed2afa915f..7d57b228a6 100644 --- a/interface/wx/string.h +++ b/interface/wx/string.h @@ -6,59 +6,6 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -/** - @class wxStringBuffer - - This tiny class allows you to conveniently access the wxString internal buffer - as a writable pointer without any risk of forgetting to restore the string - to the usable state later. - - For example, assuming you have a low-level OS function called - @c "GetMeaningOfLifeAsString(char *)" returning the value in the provided - buffer (which must be writable, of course) you might call it like this: - - @code - wxString theAnswer; - GetMeaningOfLifeAsString(wxStringBuffer(theAnswer, 1024)); - if ( theAnswer != "42" ) - wxLogError("Something is very wrong!"); - @endcode - - Note that the exact usage of this depends on whether or not wxUSE_STL is - enabled. If wxUSE_STL is enabled, wxStringBuffer creates a separate empty - character buffer, and if wxUSE_STL is disabled, it uses GetWriteBuf() from - wxString, keeping the same buffer wxString uses intact. In other words, - relying on wxStringBuffer containing the old wxString data is not a good - idea if you want to build your program both with and without wxUSE_STL. - - @library{wxbase} - @category{data} -*/ -class wxStringBuffer -{ -public: - /** - Constructs a writable string buffer object associated with the given string - and containing enough space for at least @a len characters. - Basically, this is equivalent to calling wxString::GetWriteBuf() and - saving the result. - */ - wxStringBuffer(const wxString& str, size_t len); - - /** - Restores the string passed to the constructor to the usable state by calling - wxString::UngetWriteBuf() on it. - */ - ~wxStringBuffer(); - - /** - Returns the writable pointer to a buffer of the size at least equal to the - length specified in the constructor. - */ - wxStringCharType* operator wxStringCharType *(); -}; - - /** @class wxString @@ -68,66 +15,29 @@ public: version wxWidgets 3.0. wxString is a class representing a Unicode character string. - wxString uses @c std::string internally to store its content - unless this is not supported by the compiler or disabled - specifically when building wxWidgets and it therefore inherits - many features from @c std::string. Most implementations of - @c std::string are thread-safe and don't use reference counting. - By default, wxString uses @c std::string internally even if - wxUSE_STL is not defined. - - wxString now internally uses UTF-16 under Windows and UTF-8 under - Unix, Linux and OS X to store its content. Note that when iterating - over a UTF-16 string under Windows, the user code has to take care - of surrogate pair handling whereas Windows itself has built-in - support pairs in UTF-16, such as for drawing strings on screen. - - Much work has been done to make existing code using ANSI string literals - work as before. If you nonetheless need to have a wxString that uses wchar_t - on Unix and Linux, too, you can specify this on the command line with the - @c configure @c --disable-utf8 switch or you can consider using wxUString - or std::wstring instead. - - Accessing a UTF-8 string by index can be very inefficient because - a single character is represented by a variable number of bytes so that - the entire string has to be parsed in order to find the character. - Since iterating over a string by index is a common programming technique and - was also possible and encouraged by wxString using the access operator[]() - wxString implements caching of the last used index so that iterating over - a string is a linear operation even in UTF-8 mode. - - It is nonetheless recommended to use iterators (instead of index based - access) like this: - - @code - wxString s = "hello"; - wxString::const_iterator i; - for (i = s.begin(); i != s.end(); ++i) - { - wxUniChar uni_ch = *i; - // do something with it - } - @endcode - - Please see the @ref overview_string and the @ref overview_unicode for more - information about it. - - wxString uses the current locale encoding to convert any C string - literal to Unicode. The same is done for converting to and from - @c std::string and for the return value of c_str(). - For this conversion, the @a wxConvLibc class instance is used. - See wxCSConv and wxMBConv. - - wxString implements most of the methods of the @c std::string class. - These standard functions are only listed here, but they are not - fully documented in this manual. Please see the STL documentation. + wxString uses @c std::basic_string internally (even if @c wxUSE_STL is not defined) + to store its content (unless this is not supported by the compiler or disabled + specifically when building wxWidgets) and it therefore inherits + many features from @c std::basic_string. (Note that most implementations of + @c std::basic_string are thread-safe and don't use reference counting.) + + These @c std::basic_string standard functions are only listed here, but + they are not fully documented in this manual; see the STL documentation + (http://www.cppreference.com/wiki/string/start) for more info. The behaviour of all these functions is identical to the behaviour described there. You may notice that wxString sometimes has several functions which do - the same thing like Length(), Len() and length() which - all return the string length. In all cases of such duplication the - @c std::string compatible method should be used. + the same thing like Length(), Len() and length() which all return the + string length. In all cases of such duplication the @c std::string + compatible methods should be used. + + For informations about the internal encoding used by wxString and + for important warnings and advices for using it, please read + the @ref overview_string. + + In wxWidgets 3.0 wxString always stores Unicode strings, so you should + be sure to read also @ref overview_unicode. @section string_construct Constructors and assignment operators @@ -229,6 +139,7 @@ public: original string is not modified and the function returns the extracted substring. + @li at() @li substr() @li Mid() @li operator()() @@ -1344,14 +1255,6 @@ public: STL reference for their documentation. */ //@{ - size_t length() const; - size_type size() const; - size_type max_size() const; - size_type capacity() const; - void reserve(size_t sz); - - void resize(size_t nSize, wxUniChar ch = '\0'); - wxString& append(const wxString& str, size_t pos, size_t n); wxString& append(const wxString& str); wxString& append(const char *sz, size_t n); @@ -1366,8 +1269,13 @@ public: wxString& assign(size_t n, wxUniChar ch); wxString& assign(const_iterator first, const_iterator last); + wxUniChar at(size_t n) const; + wxUniCharRef at(size_t n); + void clear(); + size_type capacity() const; + int compare(const wxString& str) const; int compare(size_t nStart, size_t nLen, const wxString& str) const; int compare(size_t nStart, size_t nLen, @@ -1377,6 +1285,8 @@ public: int compare(size_t nStart, size_t nLen, const wchar_t* sz, size_t nCount = npos) const; + wxCStrData data() const; + bool empty() const; wxString& erase(size_type pos = 0, size_type n = npos); @@ -1387,6 +1297,28 @@ public: size_t find(const char* sz, size_t nStart = 0, size_t n = npos) const; size_t find(const wchar_t* sz, size_t nStart = 0, size_t n = npos) const; size_t find(wxUniChar ch, size_t nStart = 0) const; + size_t find_first_of(const char* sz, size_t nStart = 0) const; + size_t find_first_of(const wchar_t* sz, size_t nStart = 0) const; + size_t find_first_of(const char* sz, size_t nStart, size_t n) const; + size_t find_first_of(const wchar_t* sz, size_t nStart, size_t n) const; + size_t find_first_of(wxUniChar c, size_t nStart = 0) const + size_t find_last_of (const wxString& str, size_t nStart = npos) const + size_t find_last_of (const char* sz, size_t nStart = npos) const; + size_t find_last_of (const wchar_t* sz, size_t nStart = npos) const; + size_t find_last_of(const char* sz, size_t nStart, size_t n) const; + size_t find_last_of(const wchar_t* sz, size_t nStart, size_t n) const; + size_t find_last_of(wxUniChar c, size_t nStart = npos) const + size_t find_first_not_of(const wxString& str, size_t nStart = 0) const + size_t find_first_not_of(const char* sz, size_t nStart = 0) const; + size_t find_first_not_of(const wchar_t* sz, size_t nStart = 0) const; + size_t find_first_not_of(const char* sz, size_t nStart, size_t n) const; + size_t find_first_not_of(const wchar_t* sz, size_t nStart, size_t n) const; + size_t find_first_not_of(wxUniChar ch, size_t nStart = 0) const; + size_t find_last_not_of(const wxString& str, size_t nStart = npos) const + size_t find_last_not_of(const char* sz, size_t nStart = npos) const; + size_t find_last_not_of(const wchar_t* sz, size_t nStart = npos) const; + size_t find_last_not_of(const char* sz, size_t nStart, size_t n) const; + size_t find_last_not_of(const wchar_t* sz, size_t nStart, size_t n) const; wxString& insert(size_t nPos, const wxString& str); wxString& insert(size_t nPos, const wxString& str, size_t nStart, size_t n); @@ -1397,6 +1329,13 @@ public: void insert(iterator it, const_iterator first, const_iterator last); void insert(iterator it, size_type n, wxUniChar ch); + size_t length() const; + + size_type max_size() const; + + void reserve(size_t sz); + void resize(size_t nSize, wxUniChar ch = '\0'); + wxString& replace(size_t nStart, size_t nLen, const wxString& str); wxString& replace(size_t nStart, size_t nLen, size_t nCount, wxUniChar ch); wxString& replace(size_t nStart, size_t nLen, @@ -1423,12 +1362,10 @@ public: size_t rfind(const wchar_t* sz, size_t nStart = npos, size_t n = npos) const; size_t rfind(wxUniChar ch, size_t nStart = npos) const; + size_type size() const; wxString substr(size_t nStart = 0, size_t nLen = npos) const; - void swap(wxString& str); - //@} - }; /** @@ -1510,3 +1447,55 @@ public: wxChar* operator wxChar *(); }; + +/** + @class wxStringBuffer + + This tiny class allows you to conveniently access the wxString internal buffer + as a writable pointer without any risk of forgetting to restore the string + to the usable state later. + + For example, assuming you have a low-level OS function called + @c "GetMeaningOfLifeAsString(char *)" returning the value in the provided + buffer (which must be writable, of course) you might call it like this: + + @code + wxString theAnswer; + GetMeaningOfLifeAsString(wxStringBuffer(theAnswer, 1024)); + if ( theAnswer != "42" ) + wxLogError("Something is very wrong!"); + @endcode + + Note that the exact usage of this depends on whether or not @c wxUSE_STL is + enabled. If @c wxUSE_STL is enabled, wxStringBuffer creates a separate empty + character buffer, and if @c wxUSE_STL is disabled, it uses GetWriteBuf() from + wxString, keeping the same buffer wxString uses intact. In other words, + relying on wxStringBuffer containing the old wxString data is not a good + idea if you want to build your program both with and without @c wxUSE_STL. + + @library{wxbase} + @category{data} +*/ +class wxStringBuffer +{ +public: + /** + Constructs a writable string buffer object associated with the given string + and containing enough space for at least @a len characters. + Basically, this is equivalent to calling wxString::GetWriteBuf() and + saving the result. + */ + wxStringBuffer(const wxString& str, size_t len); + + /** + Restores the string passed to the constructor to the usable state by calling + wxString::UngetWriteBuf() on it. + */ + ~wxStringBuffer(); + + /** + Returns the writable pointer to a buffer of the size at least equal to the + length specified in the constructor. + */ + wxStringCharType* operator wxStringCharType *(); +}; -- 2.45.2