/*
This header implements std::string-like string class, wxStringImpl, that is
- used by wxString to store the data. Alternatively, if wxUSE_STL=1,
+ used by wxString to store the data. Alternatively, if wxUSE_STD_STRING=1,
wxStringImpl is just a typedef to std:: string class.
*/
// implementation only
#define wxASSERT_VALID_INDEX(i) \
- wxASSERT_MSG( (size_t)(i) <= length(), _T("invalid index in wxString") )
+ wxASSERT_MSG( (size_t)(i) <= length(), wxT("invalid index in wxString") )
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
-// deal with STL/non-STL/non-STL-but-wxUSE_STD_STRING
+// deal with various build options
// ----------------------------------------------------------------------------
-// using STL implies using std::string
-#if wxUSE_STL
- #undef wxUSE_STD_STRING
- #define wxUSE_STD_STRING 1
-#endif
-
// we use STL-based string internally if we use std::string at all now, there
// should be no reason to prefer our internal implement but if you really need
// it you can predefine wxUSE_STL_BASED_WXSTRING as 0 when building the library
#undef wxUSE_STD_STRING
#define wxUSE_STD_STRING 1
+ // the versions of std::string included with gcc 2.95 and VC6 (for which
+ // _MSC_VER == 1200) and eVC4 (_MSC_VER == 1201) lack clear() method
#if (defined(__GNUG__) && (__GNUG__ < 3)) || \
- (defined(_MSC_VER) && (_MSC_VER <= 1200))
+ !wxCHECK_VISUALC_VERSION(7) || defined(__EVC4__)
#define wxSTRING_BASE_HASNT_CLEAR
#endif
wxStringImpl(const wxStringImpl& stringSrc)
{
wxASSERT_MSG( stringSrc.GetStringData()->IsValid(),
- _T("did you forget to call UngetWriteBuf()?") );
+ wxT("did you forget to call UngetWriteBuf()?") );
if ( stringSrc.empty() ) {
// nothing to do for an empty string
wxStringImpl(const wxStringImpl& str, size_t nPos, size_t nLen)
{
wxASSERT_MSG( str.GetStringData()->IsValid(),
- _T("did you forget to call UngetWriteBuf()?") );
+ wxT("did you forget to call UngetWriteBuf()?") );
Init();
size_t strLen = str.length() - nPos; nLen = strLen < nLen ? strLen : nLen;
InitWith(str.c_str(), nPos, nLen);
{ return wxStdString(c_str(), length()); }
#endif
+#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
+ // disable warning about Unlock() below not being inlined (first, it
+ // seems to be inlined nevertheless and second, even if it isn't, there
+ // is nothing we can do about this
+ #pragma warning(push)
+ #pragma warning (disable:4714)
+#endif
// dtor is not virtual, this class must not be inherited from!
~wxStringImpl()
{
-#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)
-#endif
-
GetStringData()->Unlock();
}
#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
- //re-enable inlining warning
- #pragma warning (default:4714)
+ #pragma warning(pop)
#endif
+
// overloaded assignment
// from another wxString
wxStringImpl& operator=(const wxStringImpl& stringSrc);
// lib.string.access
// return the character at position n
+ value_type operator[](size_type n) const { return m_pchData[n]; }
value_type at(size_type n) const
{ wxASSERT_VALID_INDEX( n ); return m_pchData[n]; }
// returns the writable character at position n
+ reference operator[](size_type n) { CopyBeforeWrite(); return m_pchData[n]; }
reference at(size_type n)
{
wxASSERT_VALID_INDEX( n );