diff --git a/Makefile.in b/Makefile.in
index 6d5cbdf933..b4b7e3cd63 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -538,7 +538,6 @@ ALL_BASE_HEADERS = \
wx/strconv.h \
wx/stream.h \
wx/string.h \
- wx/stringimpl.h \
wx/stringops.h \
wx/strvararg.h \
wx/sysopt.h \
@@ -725,7 +724,6 @@ ALL_PORTS_BASE_HEADERS = \
wx/strconv.h \
wx/stream.h \
wx/string.h \
- wx/stringimpl.h \
wx/stringops.h \
wx/strvararg.h \
wx/sysopt.h \
@@ -891,7 +889,6 @@ ALL_BASE_SOURCES = \
src/common/strconv.cpp \
src/common/stream.cpp \
src/common/string.cpp \
- src/common/stringimpl.cpp \
src/common/stringops.cpp \
src/common/strvararg.cpp \
src/common/sysopt.cpp \
@@ -1084,7 +1081,6 @@ MONODLL_OBJECTS = \
monodll_strconv.o \
monodll_stream.o \
monodll_string.o \
- monodll_stringimpl.o \
monodll_stringops.o \
monodll_strvararg.o \
monodll_sysopt.o \
@@ -1231,7 +1227,6 @@ MONOLIB_OBJECTS = \
monolib_strconv.o \
monolib_stream.o \
monolib_string.o \
- monolib_stringimpl.o \
monolib_stringops.o \
monolib_strvararg.o \
monolib_sysopt.o \
@@ -1362,7 +1357,6 @@ BASEDLL_OBJECTS = \
basedll_strconv.o \
basedll_stream.o \
basedll_string.o \
- basedll_stringimpl.o \
basedll_stringops.o \
basedll_strvararg.o \
basedll_sysopt.o \
@@ -1475,7 +1469,6 @@ BASELIB_OBJECTS = \
baselib_strconv.o \
baselib_stream.o \
baselib_string.o \
- baselib_stringimpl.o \
baselib_stringops.o \
baselib_strvararg.o \
baselib_sysopt.o \
@@ -14804,9 +14797,6 @@ monodll_stream.o: $(srcdir)/src/common/stream.cpp $(MONODLL_ODEP)
monodll_string.o: $(srcdir)/src/common/string.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/string.cpp
-monodll_stringimpl.o: $(srcdir)/src/common/stringimpl.cpp $(MONODLL_ODEP)
- $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/stringimpl.cpp
-
monodll_stringops.o: $(srcdir)/src/common/stringops.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/stringops.cpp
@@ -19571,9 +19561,6 @@ monolib_stream.o: $(srcdir)/src/common/stream.cpp $(MONOLIB_ODEP)
monolib_string.o: $(srcdir)/src/common/string.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/string.cpp
-monolib_stringimpl.o: $(srcdir)/src/common/stringimpl.cpp $(MONOLIB_ODEP)
- $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/stringimpl.cpp
-
monolib_stringops.o: $(srcdir)/src/common/stringops.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/stringops.cpp
@@ -24338,9 +24325,6 @@ basedll_stream.o: $(srcdir)/src/common/stream.cpp $(BASEDLL_ODEP)
basedll_string.o: $(srcdir)/src/common/string.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/string.cpp
-basedll_stringimpl.o: $(srcdir)/src/common/stringimpl.cpp $(BASEDLL_ODEP)
- $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/stringimpl.cpp
-
basedll_stringops.o: $(srcdir)/src/common/stringops.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/stringops.cpp
@@ -24827,9 +24811,6 @@ baselib_stream.o: $(srcdir)/src/common/stream.cpp $(BASELIB_ODEP)
baselib_string.o: $(srcdir)/src/common/string.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/string.cpp
-baselib_stringimpl.o: $(srcdir)/src/common/stringimpl.cpp $(BASELIB_ODEP)
- $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/stringimpl.cpp
-
baselib_stringops.o: $(srcdir)/src/common/stringops.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/stringops.cpp
diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl
index fd52a78c14..8705d39c55 100644
--- a/build/bakefiles/files.bkl
+++ b/build/bakefiles/files.bkl
@@ -547,7 +547,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/common/strconv.cpp
src/common/stream.cpp
src/common/string.cpp
- src/common/stringimpl.cpp
src/common/stringops.cpp
src/common/strvararg.cpp
src/common/sysopt.cpp
@@ -696,7 +695,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
wx/strconv.h
wx/stream.h
wx/string.h
- wx/stringimpl.h
wx/stringops.h
wx/strvararg.h
wx/sysopt.h
diff --git a/build/cmake/files.cmake b/build/cmake/files.cmake
index 94fb359da8..14f11f57cb 100644
--- a/build/cmake/files.cmake
+++ b/build/cmake/files.cmake
@@ -460,7 +460,6 @@ set(BASE_CMN_SRC
src/common/strconv.cpp
src/common/stream.cpp
src/common/string.cpp
- src/common/stringimpl.cpp
src/common/stringops.cpp
src/common/strvararg.cpp
src/common/sysopt.cpp
@@ -611,7 +610,6 @@ set(BASE_CMN_HDR
wx/strconv.h
wx/stream.h
wx/string.h
- wx/stringimpl.h
wx/stringops.h
wx/strvararg.h
wx/sysopt.h
diff --git a/build/files b/build/files
index bc7492d79d..7af77a8248 100644
--- a/build/files
+++ b/build/files
@@ -479,7 +479,6 @@ BASE_CMN_SRC =
src/common/strconv.cpp
src/common/stream.cpp
src/common/string.cpp
- src/common/stringimpl.cpp
src/common/stringops.cpp
src/common/strvararg.cpp
src/common/sysopt.cpp
@@ -628,7 +627,6 @@ BASE_CMN_HDR =
wx/strconv.h
wx/stream.h
wx/string.h
- wx/stringimpl.h
wx/stringops.h
wx/strvararg.h
wx/sysopt.h
diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc
index 8c0d8a14ae..c69dc13d48 100644
--- a/build/msw/makefile.gcc
+++ b/build/msw/makefile.gcc
@@ -460,7 +460,6 @@ MONODLL_OBJECTS = \
$(OBJS)\monodll_strconv.o \
$(OBJS)\monodll_stream.o \
$(OBJS)\monodll_string.o \
- $(OBJS)\monodll_stringimpl.o \
$(OBJS)\monodll_stringops.o \
$(OBJS)\monodll_strvararg.o \
$(OBJS)\monodll_sysopt.o \
@@ -620,7 +619,6 @@ MONOLIB_OBJECTS = \
$(OBJS)\monolib_strconv.o \
$(OBJS)\monolib_stream.o \
$(OBJS)\monolib_string.o \
- $(OBJS)\monolib_stringimpl.o \
$(OBJS)\monolib_stringops.o \
$(OBJS)\monolib_strvararg.o \
$(OBJS)\monolib_sysopt.o \
@@ -772,7 +770,6 @@ BASEDLL_OBJECTS = \
$(OBJS)\basedll_strconv.o \
$(OBJS)\basedll_stream.o \
$(OBJS)\basedll_string.o \
- $(OBJS)\basedll_stringimpl.o \
$(OBJS)\basedll_stringops.o \
$(OBJS)\basedll_strvararg.o \
$(OBJS)\basedll_sysopt.o \
@@ -905,7 +902,6 @@ BASELIB_OBJECTS = \
$(OBJS)\baselib_strconv.o \
$(OBJS)\baselib_stream.o \
$(OBJS)\baselib_string.o \
- $(OBJS)\baselib_stringimpl.o \
$(OBJS)\baselib_stringops.o \
$(OBJS)\baselib_strvararg.o \
$(OBJS)\baselib_sysopt.o \
@@ -7112,9 +7108,6 @@ $(OBJS)\monodll_stream.o: ../../src/common/stream.cpp
$(OBJS)\monodll_string.o: ../../src/common/string.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
-$(OBJS)\monodll_stringimpl.o: ../../src/common/stringimpl.cpp
- $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
-
$(OBJS)\monodll_stringops.o: ../../src/common/stringops.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -9702,9 +9695,6 @@ $(OBJS)\monolib_stream.o: ../../src/common/stream.cpp
$(OBJS)\monolib_string.o: ../../src/common/string.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
-$(OBJS)\monolib_stringimpl.o: ../../src/common/stringimpl.cpp
- $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
-
$(OBJS)\monolib_stringops.o: ../../src/common/stringops.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -12292,9 +12282,6 @@ $(OBJS)\basedll_stream.o: ../../src/common/stream.cpp
$(OBJS)\basedll_string.o: ../../src/common/string.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
-$(OBJS)\basedll_stringimpl.o: ../../src/common/stringimpl.cpp
- $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
-
$(OBJS)\basedll_stringops.o: ../../src/common/stringops.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
@@ -12643,9 +12630,6 @@ $(OBJS)\baselib_stream.o: ../../src/common/stream.cpp
$(OBJS)\baselib_string.o: ../../src/common/string.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
-$(OBJS)\baselib_stringimpl.o: ../../src/common/stringimpl.cpp
- $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
-
$(OBJS)\baselib_stringops.o: ../../src/common/stringops.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc
index 4ca26cc367..6200a980db 100644
--- a/build/msw/makefile.vc
+++ b/build/msw/makefile.vc
@@ -490,7 +490,6 @@ MONODLL_OBJECTS = \
$(OBJS)\monodll_strconv.obj \
$(OBJS)\monodll_stream.obj \
$(OBJS)\monodll_string.obj \
- $(OBJS)\monodll_stringimpl.obj \
$(OBJS)\monodll_stringops.obj \
$(OBJS)\monodll_strvararg.obj \
$(OBJS)\monodll_sysopt.obj \
@@ -657,7 +656,6 @@ MONOLIB_OBJECTS = \
$(OBJS)\monolib_strconv.obj \
$(OBJS)\monolib_stream.obj \
$(OBJS)\monolib_string.obj \
- $(OBJS)\monolib_stringimpl.obj \
$(OBJS)\monolib_stringops.obj \
$(OBJS)\monolib_strvararg.obj \
$(OBJS)\monolib_sysopt.obj \
@@ -818,7 +816,6 @@ BASEDLL_OBJECTS = \
$(OBJS)\basedll_strconv.obj \
$(OBJS)\basedll_stream.obj \
$(OBJS)\basedll_string.obj \
- $(OBJS)\basedll_stringimpl.obj \
$(OBJS)\basedll_stringops.obj \
$(OBJS)\basedll_strvararg.obj \
$(OBJS)\basedll_sysopt.obj \
@@ -961,7 +958,6 @@ BASELIB_OBJECTS = \
$(OBJS)\baselib_strconv.obj \
$(OBJS)\baselib_stream.obj \
$(OBJS)\baselib_string.obj \
- $(OBJS)\baselib_stringimpl.obj \
$(OBJS)\baselib_stringops.obj \
$(OBJS)\baselib_strvararg.obj \
$(OBJS)\baselib_sysopt.obj \
@@ -7557,9 +7553,6 @@ $(OBJS)\monodll_stream.obj: ..\..\src\common\stream.cpp
$(OBJS)\monodll_string.obj: ..\..\src\common\string.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\string.cpp
-$(OBJS)\monodll_stringimpl.obj: ..\..\src\common\stringimpl.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\stringimpl.cpp
-
$(OBJS)\monodll_stringops.obj: ..\..\src\common\stringops.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\stringops.cpp
@@ -10147,9 +10140,6 @@ $(OBJS)\monolib_stream.obj: ..\..\src\common\stream.cpp
$(OBJS)\monolib_string.obj: ..\..\src\common\string.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\string.cpp
-$(OBJS)\monolib_stringimpl.obj: ..\..\src\common\stringimpl.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\stringimpl.cpp
-
$(OBJS)\monolib_stringops.obj: ..\..\src\common\stringops.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\stringops.cpp
@@ -12737,9 +12727,6 @@ $(OBJS)\basedll_stream.obj: ..\..\src\common\stream.cpp
$(OBJS)\basedll_string.obj: ..\..\src\common\string.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\string.cpp
-$(OBJS)\basedll_stringimpl.obj: ..\..\src\common\stringimpl.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\stringimpl.cpp
-
$(OBJS)\basedll_stringops.obj: ..\..\src\common\stringops.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\stringops.cpp
@@ -13088,9 +13075,6 @@ $(OBJS)\baselib_stream.obj: ..\..\src\common\stream.cpp
$(OBJS)\baselib_string.obj: ..\..\src\common\string.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\string.cpp
-$(OBJS)\baselib_stringimpl.obj: ..\..\src\common\stringimpl.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\stringimpl.cpp
-
$(OBJS)\baselib_stringops.obj: ..\..\src\common\stringops.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\stringops.cpp
diff --git a/build/msw/wx_base.vcxproj b/build/msw/wx_base.vcxproj
index 10f62c281e..13eaef3b46 100644
--- a/build/msw/wx_base.vcxproj
+++ b/build/msw/wx_base.vcxproj
@@ -535,7 +535,6 @@
-
@@ -791,7 +790,6 @@
-
diff --git a/build/msw/wx_base.vcxproj.filters b/build/msw/wx_base.vcxproj.filters
index 63023344b7..cb7f943554 100644
--- a/build/msw/wx_base.vcxproj.filters
+++ b/build/msw/wx_base.vcxproj.filters
@@ -219,9 +219,6 @@
Common Sources
-
- Common Sources
-
Common Sources
@@ -814,9 +811,6 @@
Common Headers
-
- Common Headers
-
Common Headers
diff --git a/build/osx/wxcocoa.xcodeproj/project.pbxproj b/build/osx/wxcocoa.xcodeproj/project.pbxproj
index 3fe4cee0cf..dbe22de8c5 100644
--- a/build/osx/wxcocoa.xcodeproj/project.pbxproj
+++ b/build/osx/wxcocoa.xcodeproj/project.pbxproj
@@ -307,7 +307,6 @@
28ADE8D385A53445A5451F23 /* jdhuff.c in Sources */ = {isa = PBXBuildFile; fileRef = 72869747E68E37998CB0A07E /* jdhuff.c */; };
BD53E095EC1136EF853A47D9 /* m_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5EE0B8985443BDCB36F781F /* m_layout.cpp */; };
4788F736CD9C324E8A3DFA74 /* LexEScript.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 58EFF24DE2E737CA8A164F5C /* LexEScript.cxx */; };
- 55F0D287F60F3EDEA16CCB64 /* stringimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E5357E76650035639844D15B /* stringimpl.cpp */; };
EAE02BA934B43EEE92C496C8 /* dcpsg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EEA0945B20913754A54D0FD9 /* dcpsg.cpp */; };
6AC347D2DCC730149A0A83D8 /* button_osx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF4F4F5211933057824B5621 /* button_osx.cpp */; };
2EECB3C2F9523D0B95847A7F /* accel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C78A1539462370CAA429508 /* accel.cpp */; };
@@ -740,7 +739,6 @@
784F7C50882F320FA76537B5 /* LexAU3.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C76222F466E831F896A89269 /* LexAU3.cxx */; };
BF068F3C06473D8CBC55D508 /* PositionCache.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BCD873D873A53BBF955D8A4E /* PositionCache.cxx */; };
700BBDECBE313E108BA99ABD /* toplvcmn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 861438BD294335D4B859EA71 /* toplvcmn.cpp */; };
- 55F0D287F60F3EDEA16CCB65 /* stringimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E5357E76650035639844D15B /* stringimpl.cpp */; };
20BEEFFA08F3396791596871 /* dlunix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA2D9F325F833C408657E7B7 /* dlunix.cpp */; };
1E17F95DD433379E8C18298C /* odcombo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7906BD74118A3B4DAC515BC2 /* odcombo.cpp */; };
97C551F8AEF133D680D1FD36 /* LexProgress.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E4A9905843A4683A6B460 /* LexProgress.cxx */; };
@@ -2272,7 +2270,6 @@
05814571E7A83F5DBFB6E4C7 /* msgout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E968913A9A593B258BD8EACB /* msgout.cpp */; };
DC6B669C9A78398F914AEE55 /* fontutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5FF661188B563D27A11F5716 /* fontutil.cpp */; };
6D723C987BFB39B7B887DCB3 /* Editor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DA5E95D498C53A808A8E2EEB /* Editor.cxx */; };
- 55F0D287F60F3EDEA16CCB66 /* stringimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E5357E76650035639844D15B /* stringimpl.cpp */; };
438EAEA4B30C325C827F6199 /* xh_fontpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 87E609641B583666AB9D1D58 /* xh_fontpicker.cpp */; };
0164A65CDB7A334A8E9AA4C1 /* dynload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93BA27DFFB023F2EBD6295E3 /* dynload.cpp */; };
86003C8EB906304F9025F78A /* jcinit.c in Sources */ = {isa = PBXBuildFile; fileRef = AA6C6739C3BD3EFA9CF71102 /* jcinit.c */; };
@@ -4167,7 +4164,6 @@
080597FC0436378E96EDA94B /* m_links.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = m_links.cpp; path = ../../src/html/m_links.cpp; sourceTree = SOURCE_ROOT; };
726C0457DF1232C793918DC1 /* tif_zip.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = tif_zip.c; path = ../../src/tiff/libtiff/tif_zip.c; sourceTree = SOURCE_ROOT; };
C3904351139F3F0DB4B72F94 /* pcre2_auto_possess.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pcre2_auto_possess.c; path = ../../3rdparty/pcre/src/pcre2_auto_possess.c; sourceTree = SOURCE_ROOT; };
- E5357E76650035639844D15B /* stringimpl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stringimpl.cpp; path = ../../src/common/stringimpl.cpp; sourceTree = SOURCE_ROOT; };
B60497805D37375EBFCF3D98 /* pcre2_tables.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pcre2_tables.c; path = ../../3rdparty/pcre/src/pcre2_tables.c; sourceTree = SOURCE_ROOT; };
FC6A8FAE9CA63EEB8883B6BD /* pcre2_config.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pcre2_config.c; path = ../../3rdparty/pcre/src/pcre2_config.c; sourceTree = SOURCE_ROOT; };
A0DCC5EF59143640BE13AD73 /* jidctfst.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jidctfst.c; path = ../../src/jpeg/jidctfst.c; sourceTree = SOURCE_ROOT; };
@@ -6370,7 +6366,6 @@
9FEB8204E530329FA085E5B8 /* strconv.cpp */,
FFDD414DBCC73D0FB6C2C5FD /* stream.cpp */,
F7E99B35A98D30818120B002 /* string.cpp */,
- E5357E76650035639844D15B /* stringimpl.cpp */,
F1E724EA70AB35DDB130F84F /* stringops.cpp */,
0EEAD9C3E180305D8899441E /* strvararg.cpp */,
F32F6B47EBB23068B1FCDC0D /* sysopt.cpp */,
@@ -7702,7 +7697,6 @@
E882402BEE0330A080A65171 /* strconv.cpp in Sources */,
30493B486DFF35AF80D12C49 /* stream.cpp in Sources */,
795613831EC8332A83FF26E8 /* string.cpp in Sources */,
- 55F0D287F60F3EDEA16CCB64 /* stringimpl.cpp in Sources */,
88E1AE56FD393C8BA5CF8546 /* stringops.cpp in Sources */,
056E30EA43753A7CB1AF8C9F /* strvararg.cpp in Sources */,
4DD98A9436C83CF3B9425A78 /* sysopt.cpp in Sources */,
@@ -8426,7 +8420,6 @@
E882402BEE0330A080A6516F /* strconv.cpp in Sources */,
30493B486DFF35AF80D12C4B /* stream.cpp in Sources */,
795613831EC8332A83FF26E9 /* string.cpp in Sources */,
- 55F0D287F60F3EDEA16CCB66 /* stringimpl.cpp in Sources */,
88E1AE56FD393C8BA5CF8545 /* stringops.cpp in Sources */,
056E30EA43753A7CB1AF8C9E /* strvararg.cpp in Sources */,
4DD98A9436C83CF3B9425A7A /* sysopt.cpp in Sources */,
@@ -9750,7 +9743,6 @@
E882402BEE0330A080A65170 /* strconv.cpp in Sources */,
30493B486DFF35AF80D12C4A /* stream.cpp in Sources */,
795613831EC8332A83FF26E7 /* string.cpp in Sources */,
- 55F0D287F60F3EDEA16CCB65 /* stringimpl.cpp in Sources */,
88E1AE56FD393C8BA5CF8547 /* stringops.cpp in Sources */,
056E30EA43753A7CB1AF8CA0 /* strvararg.cpp in Sources */,
4DD98A9436C83CF3B9425A79 /* sysopt.cpp in Sources */,
diff --git a/build/osx/wxiphone.xcodeproj/project.pbxproj b/build/osx/wxiphone.xcodeproj/project.pbxproj
index 1f4e9f1654..b3b52e00c0 100644
--- a/build/osx/wxiphone.xcodeproj/project.pbxproj
+++ b/build/osx/wxiphone.xcodeproj/project.pbxproj
@@ -457,7 +457,6 @@
0D6596A44A8C37DE85D578F6 /* Document.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 71DB140E670738839EC42C2B /* Document.cxx */; };
353B584AD0C03919A57A3048 /* affinematrix2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD09A813E10A31C19554B425 /* affinematrix2d.cpp */; };
EA10DA3199813E90B39C70D3 /* xh_infobar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45C65E309F3A39598C043657 /* xh_infobar.cpp */; };
- 55F0D287F60F3EDEA16CCB64 /* stringimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E5357E76650035639844D15B /* stringimpl.cpp */; };
056CA84179433AA48D55DA65 /* bar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FDDE855D9F83E4891362EB4 /* bar.cpp */; };
E3AD8574E13B39BDB8D4E92E /* LexKVIrc.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FCE8B55EBD6B348B8351AB08 /* LexKVIrc.cxx */; };
90BC965B1A1F35A3B2C9D1C9 /* Decoration.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BF1C44D726E63B18A98006EC /* Decoration.cxx */; };
@@ -1350,7 +1349,6 @@
7A1CE0B28CB73F90AE92B5AB /* richtooltipcmn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = richtooltipcmn.cpp; path = ../../src/common/richtooltipcmn.cpp; sourceTree = SOURCE_ROOT; };
93BA27DFFB023F2EBD6295E3 /* dynload.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dynload.cpp; path = ../../src/common/dynload.cpp; sourceTree = SOURCE_ROOT; };
B4028ABB08C63AB59F5F240B /* m_list.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = m_list.cpp; path = ../../src/html/m_list.cpp; sourceTree = SOURCE_ROOT; };
- E5357E76650035639844D15B /* stringimpl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stringimpl.cpp; path = ../../src/common/stringimpl.cpp; sourceTree = SOURCE_ROOT; };
497861EB7E623C68951D1AB2 /* LexAPDL.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LexAPDL.cxx; path = ../../src/stc/scintilla/lexers/LexAPDL.cxx; sourceTree = SOURCE_ROOT; };
DDE22D7DDAC93DCABAE5AED0 /* socketiohandler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = socketiohandler.cpp; path = ../../src/common/socketiohandler.cpp; sourceTree = SOURCE_ROOT; };
DE16011AD6323AAC8616F973 /* stdstream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stdstream.cpp; path = ../../src/common/stdstream.cpp; sourceTree = SOURCE_ROOT; };
@@ -2158,7 +2156,6 @@
9FEB8204E530329FA085E5B8 /* strconv.cpp */,
FFDD414DBCC73D0FB6C2C5FD /* stream.cpp */,
F7E99B35A98D30818120B002 /* string.cpp */,
- E5357E76650035639844D15B /* stringimpl.cpp */,
F1E724EA70AB35DDB130F84F /* stringops.cpp */,
0EEAD9C3E180305D8899441E /* strvararg.cpp */,
F32F6B47EBB23068B1FCDC0D /* sysopt.cpp */,
@@ -3095,7 +3092,6 @@
E882402BEE0330A080A6516F /* strconv.cpp in Sources */,
30493B486DFF35AF80D12C49 /* stream.cpp in Sources */,
795613831EC8332A83FF26E7 /* string.cpp in Sources */,
- 55F0D287F60F3EDEA16CCB64 /* stringimpl.cpp in Sources */,
88E1AE56FD393C8BA5CF8545 /* stringops.cpp in Sources */,
056E30EA43753A7CB1AF8C9E /* strvararg.cpp in Sources */,
4DD98A9436C83CF3B9425A78 /* sysopt.cpp in Sources */,
diff --git a/include/wx/string.h b/include/wx/string.h
index d48d49dfdd..cc8f0abc51 100644
--- a/include/wx/string.h
+++ b/include/wx/string.h
@@ -33,14 +33,18 @@
#include
#include
+#include "wx/chartype.h" // for wxChar
#include "wx/wxcrtbase.h" // for wxChar, wxStrlen() etc.
#include "wx/strvararg.h"
#include "wx/buffer.h" // for wxCharBuffer
#include "wx/strconv.h" // for wxConvertXXX() macros and wxMBConv classes
-#include "wx/stringimpl.h"
#include "wx/stringops.h"
#include "wx/unichar.h"
+#include "wx/beforestd.h"
+#include
+#include "wx/afterstd.h"
+
// by default we cache the mapping of the positions in UTF-8 string to the byte
// offset as this results in noticeable performance improvements for loops over
// strings using indices; comment out this line to disable this
@@ -92,6 +96,32 @@ namespace wxPrivate
template struct wxStringAsBufHelper;
}
+// All the symbols here only exist for compatibility in case they're referenced
+// in the existing code.
+#define wxUSE_STL_BASED_WXSTRING 1
+
+// Define this for compatibility only, it is not used any longer.
+typedef std::wstring wxStdWideString;
+
+#if wxUSE_UNICODE_WCHAR
+ typedef std::wstring wxStdString;
+#else
+ typedef std::string wxStdString;
+#endif
+
+typedef wxStdString wxStringImpl;
+
+// ----------------------------------------------------------------------------
+// global data
+// ----------------------------------------------------------------------------
+
+// global pointer to empty string
+extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxEmptyString;
+#if wxUSE_UNICODE_UTF8
+// FIXME-UTF8: we should have only one wxEmptyString
+extern WXDLLIMPEXP_DATA_BASE(const wxStringCharType*) wxEmptyStringImpl;
+#endif
+
// ---------------------------------------------------------------------------
// macros
// ---------------------------------------------------------------------------
@@ -673,7 +703,6 @@ public:
typedef size_t size_type;
typedef const wxUniChar const_reference;
-#if wxUSE_STD_STRING
#if wxUSE_UNICODE_UTF8
// random access is not O(1), as required by Random Access Iterator
#define WX_STR_ITERATOR_TAG std::bidirectional_iterator_tag
@@ -681,12 +710,6 @@ public:
#define WX_STR_ITERATOR_TAG std::random_access_iterator_tag
#endif
#define WX_DEFINE_ITERATOR_CATEGORY(cat) typedef cat iterator_category;
-#else
- // not defining iterator_category at all in this case is better than defining
- // it as some dummy type -- at least it results in more intelligible error
- // messages
- #define WX_DEFINE_ITERATOR_CATEGORY(cat)
-#endif
#define WX_STR_ITERATOR_IMPL(iterator_name, pointer_type, reference_type) \
private: \
@@ -1053,7 +1076,7 @@ private:
// instead we define dummy type that lets us have wxString ctor for creation
// from wxStringImpl that couldn't be used by user code (in all other builds,
// "standard" ctors can be used):
-#if wxUSE_UNICODE_UTF8 && wxUSE_STL_BASED_WXSTRING
+#if wxUSE_UNICODE_UTF8
struct CtorFromStringImplTag {};
wxString(CtorFromStringImplTag* WXUNUSED(dummy), const wxStringImpl& src)
@@ -1062,10 +1085,6 @@ private:
static wxString FromImpl(const wxStringImpl& src)
{ return wxString((CtorFromStringImplTag*)nullptr, src); }
#else
- #if !wxUSE_STL_BASED_WXSTRING
- wxString(const wxStringImpl& src) : m_impl(src) { }
- // else: already defined as wxString(wxStdString) below
- #endif
static wxString FromImpl(const wxStringImpl& src) { return wxString(src); }
#endif
@@ -1181,14 +1200,6 @@ public:
}
#endif // wxUSE_STRING_POS_CACHE
- // even if we're not built with wxUSE_STD_STRING_CONV_IN_WXSTRING == 1 it is
- // very convenient to allow implicit conversions from std::string to wxString
- // and vice verse as this allows to use the same strings in non-GUI and GUI
- // code, however we don't want to unconditionally add this ctor as it would
- // make wx lib dependent on libstdc++ on some Linux versions which is bad, so
- // instead we ask the client code to define this wxUSE_STD_STRING symbol if
- // they need it
-#if wxUSE_STD_STRING
#if wxUSE_UNICODE_WCHAR
wxString(const std::wstring& str) : m_impl(str) {}
#else // UTF-8 or ANSI
@@ -1200,14 +1211,12 @@ public:
wxString(const std::string& str)
{ assign(str.c_str(), str.length()); }
#endif // wxNO_IMPLICIT_WXSTRING_ENCODING
-#endif // wxUSE_STD_STRING
// Also always provide explicit conversions to std::[w]string in any case,
// see below for the implicit ones.
-#if wxUSE_STD_STRING
// We can avoid a copy if we already use this string type internally,
// otherwise we create a copy on the fly:
- #if wxUSE_UNICODE_WCHAR && wxUSE_STL_BASED_WXSTRING
+ #if wxUSE_UNICODE_WCHAR
#define wxStringToStdWstringRetType const std::wstring&
const std::wstring& ToStdWstring() const { return m_impl; }
#else
@@ -1226,7 +1235,7 @@ public:
}
#endif
- #if wxUSE_UTF8_LOCALE_ONLY && wxUSE_STL_BASED_WXSTRING
+ #if wxUSE_UTF8_LOCALE_ONLY
// wxStringImpl is std::string in the encoding we want
#define wxStringToStdStringRetType const std::string&
const std::string& ToStdString() const { return m_impl; }
@@ -1261,8 +1270,6 @@ public:
#undef wxStringToStdStringRetType
#undef wxStringToStdWstringRetType
-#endif // wxUSE_STD_STRING
-
wxString Clone() const
{
// make a deep copy of the string, i.e. the returned string will have
@@ -1605,14 +1612,9 @@ public:
return FromImpl(wxStringImpl(utf8, len));
}
-#if wxUSE_STD_STRING
static wxString FromUTF8Unchecked(const std::string& utf8)
{
wxASSERT( wxStringOperations::IsValidUtf8String(utf8.c_str(), utf8.length()) );
- /*
- Note that, under wxUSE_UNICODE_UTF8 and wxUSE_STD_STRING, wxStringImpl can be
- initialized with a std::string whether wxUSE_STL_BASED_WXSTRING is 1 or not.
- */
return FromImpl(utf8);
}
static wxString FromUTF8(const std::string& utf8)
@@ -1623,7 +1625,6 @@ public:
}
std::string utf8_string() const { return m_impl; }
-#endif
const wxScopedCharBuffer utf8_str() const
{ return wxCharBuffer::CreateNonOwned(m_impl.c_str(), m_impl.length()); }
@@ -1641,14 +1642,12 @@ public:
"string must be valid UTF-8" );
return s;
}
-#if wxUSE_STD_STRING
static wxString FromUTF8(const std::string& utf8)
{ return FromUTF8(utf8.c_str(), utf8.length()); }
static wxString FromUTF8Unchecked(const std::string& utf8)
{ return FromUTF8Unchecked(utf8.c_str(), utf8.length()); }
std::string utf8_string() const { return ToStdString(wxMBConvUTF8()); }
-#endif
const wxScopedCharBuffer utf8_str() const { return mb_str(wxMBConvUTF8()); }
#else // ANSI
static wxString FromUTF8(const char *utf8)
@@ -1676,14 +1675,12 @@ public:
return wxString(buf.data(), wlen);
}
-#if wxUSE_STD_STRING
static wxString FromUTF8(const std::string& utf8)
{ return FromUTF8(utf8.c_str(), utf8.length()); }
static wxString FromUTF8Unchecked(const std::string& utf8)
{ return FromUTF8Unchecked(utf8.c_str(), utf8.length()); }
std::string utf8_string() const { return ToStdString(wxMBConvUTF8()); }
-#endif
const wxScopedCharBuffer utf8_str() const
{
if (empty())
@@ -1798,7 +1795,6 @@ public:
{ return operator=(wxUniChar(ch)); }
// from a C string - STL probably will crash on nullptr,
// so we need to compensate in that case
-#if wxUSE_STL_BASED_WXSTRING
#ifndef wxNO_IMPLICIT_WXSTRING_ENCODING
wxString& operator=(const char *psz)
{
@@ -1824,27 +1820,6 @@ public:
return *this;
}
-#else // !wxUSE_STL_BASED_WXSTRING
-#ifndef wxNO_IMPLICIT_WXSTRING_ENCODING
- wxString& operator=(const char *psz)
- {
- wxSTRING_INVALIDATE_CACHE();
-
- m_impl = ImplStr(psz);
-
- return *this;
- }
-#endif // wxNO_IMPLICIT_WXSTRING_ENCODING
-
- wxString& operator=(const wchar_t *pwz)
- {
- wxSTRING_INVALIDATE_CACHE();
-
- m_impl = ImplStr(pwz);
-
- return *this;
- }
-#endif // wxUSE_STL_BASED_WXSTRING/!wxUSE_STL_BASED_WXSTRING
#ifndef wxNO_IMPLICIT_WXSTRING_ENCODING
wxString& operator=(const unsigned char *psz)
@@ -3081,7 +3056,7 @@ public:
{ return rfind(wxUniChar(ch), nStart); }
// find first/last occurrence of any character (not) in the set:
-#if wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8
+#if !wxUSE_UNICODE_UTF8
// FIXME-UTF8: this is not entirely correct, because it doesn't work if
// sizeof(wchar_t)==2 and surrogates are present in the string;
// should we care? Probably not.
@@ -3217,7 +3192,7 @@ public:
size_t find_last_not_of(const wchar_t* sz, size_t nStart, size_t n) const;
// same as above
size_t find_last_not_of(wxUniChar ch, size_t nStart = npos) const;
-#endif // wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 or not
+#endif // !wxUSE_UNICODE_UTF8
// provide char/wchar_t/wxUniCharRef overloads for char-finding functions
// above to resolve ambiguities:
@@ -3398,28 +3373,6 @@ public:
wxString& operator+=(wchar_t ch) { return *this += wxUniChar(ch); }
private:
-#if !wxUSE_STL_BASED_WXSTRING
- // helpers for wxStringBuffer and wxStringBufferLength
- wxStringCharType *DoGetWriteBuf(size_t nLen)
- {
- return m_impl.DoGetWriteBuf(nLen);
- }
-
- void DoUngetWriteBuf()
- {
- wxSTRING_INVALIDATE_CACHE();
-
- m_impl.DoUngetWriteBuf();
- }
-
- void DoUngetWriteBuf(size_t nLen)
- {
- wxSTRING_INVALIDATE_CACHE();
-
- m_impl.DoUngetWriteBuf(nLen);
- }
-#endif // !wxUSE_STL_BASED_WXSTRING
-
#if !wxUSE_UTF8_LOCALE_ONLY
int DoPrintfWchar(const wxChar *format, ...);
static wxString DoFormatWchar(const wxChar *format, ...);
@@ -3429,11 +3382,6 @@ private:
static wxString DoFormatUtf8(const char *format, ...);
#endif
-#if !wxUSE_STL_BASED_WXSTRING
- // check string's data validity
- bool IsValid() const { return m_impl.GetStringData()->IsValid(); }
-#endif
-
private:
wxStringImpl m_impl;
@@ -3681,61 +3629,6 @@ struct wxStringAsBufHelper
// wxStringBuffer: a tiny class allowing to get a writable pointer into string
// ----------------------------------------------------------------------------
-#if !wxUSE_STL_BASED_WXSTRING
-// string buffer for direct access to string data in their native
-// representation:
-class wxStringInternalBuffer
-{
-public:
- typedef wxStringCharType CharType;
-
- wxStringInternalBuffer(wxString& str, size_t lenWanted = 1024)
- : m_str(str), m_buf(nullptr)
- { m_buf = m_str.DoGetWriteBuf(lenWanted); }
-
- ~wxStringInternalBuffer() { m_str.DoUngetWriteBuf(); }
-
- operator wxStringCharType*() const { return m_buf; }
-
-private:
- wxString& m_str;
- wxStringCharType *m_buf;
-
- wxDECLARE_NO_COPY_CLASS(wxStringInternalBuffer);
-};
-
-class wxStringInternalBufferLength
-{
-public:
- typedef wxStringCharType CharType;
-
- wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024)
- : m_str(str), m_buf(nullptr), m_len(0), m_lenSet(false)
- {
- m_buf = m_str.DoGetWriteBuf(lenWanted);
- wxASSERT(m_buf != nullptr);
- }
-
- ~wxStringInternalBufferLength()
- {
- wxASSERT(m_lenSet);
- m_str.DoUngetWriteBuf(m_len);
- }
-
- operator wxStringCharType*() const { return m_buf; }
- void SetLength(size_t length) { m_len = length; m_lenSet = true; }
-
-private:
- wxString& m_str;
- wxStringCharType *m_buf;
- size_t m_len;
- bool m_lenSet;
-
- wxDECLARE_NO_COPY_CLASS(wxStringInternalBufferLength);
-};
-
-#endif // !wxUSE_STL_BASED_WXSTRING
-
template
class wxStringTypeBufferBase
{
@@ -3828,8 +3721,6 @@ public:
wxDECLARE_NO_COPY_CLASS(wxStringTypeBufferLength);
};
-#if wxUSE_STL_BASED_WXSTRING
-
class wxStringInternalBuffer : public wxStringTypeBufferBase
{
public:
@@ -3856,16 +3747,13 @@ public:
wxDECLARE_NO_COPY_CLASS(wxStringInternalBufferLength);
};
-#endif // wxUSE_STL_BASED_WXSTRING
-
-
-#if wxUSE_STL_BASED_WXSTRING || wxUSE_UNICODE_UTF8
+#if wxUSE_UNICODE_UTF8
typedef wxStringTypeBuffer wxStringBuffer;
typedef wxStringTypeBufferLength wxStringBufferLength;
-#else // if !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8
+#else // !wxUSE_UNICODE_UTF8
typedef wxStringInternalBuffer wxStringBuffer;
typedef wxStringInternalBufferLength wxStringBufferLength;
-#endif // !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8
+#endif // wxUSE_UNICODE_UTF8/!wxUSE_UNICODE_UTF8
#if wxUSE_UNICODE_UTF8
typedef wxStringInternalBuffer wxUTF8StringBuffer;
@@ -4063,11 +3951,6 @@ wxDEFINE_ALL_COMPARISONS(const char *, const wxCStrData&, wxCMP_CHAR_CSTRDATA)
// Implement hashing using C++11 std::hash<>.
// ----------------------------------------------------------------------------
-// Don't do this if ToStdWstring() is not available. We could work around it
-// but, presumably, if using std::wstring is undesirable, then so is using
-// std::hash<> anyhow.
-#if wxUSE_STD_STRING
-
#include
namespace std
@@ -4082,8 +3965,6 @@ namespace std
};
} // namespace std
-#endif // wxUSE_STD_STRING
-
// ---------------------------------------------------------------------------
// Implementation only from here until the end of file
// ---------------------------------------------------------------------------
diff --git a/include/wx/stringimpl.h b/include/wx/stringimpl.h
deleted file mode 100644
index b8ab191058..0000000000
--- a/include/wx/stringimpl.h
+++ /dev/null
@@ -1,552 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-// Name: wx/stringimpl.h
-// Purpose: wxStringImpl class, implementation of wxString
-// Author: Vadim Zeitlin
-// Modified by:
-// Created: 29/01/98
-// Copyright: (c) 1998 Vadim Zeitlin
-// Licence: wxWindows licence
-///////////////////////////////////////////////////////////////////////////////
-
-/*
- This header implements std::string-like string class, wxStringImpl, that is
- used by wxString to store the data. Alternatively, if wxUSE_STD_STRING=1,
- wxStringImpl is just a typedef to std:: string class.
-*/
-
-#ifndef _WX_WXSTRINGIMPL_H__
-#define _WX_WXSTRINGIMPL_H__
-
-// ----------------------------------------------------------------------------
-// headers
-// ----------------------------------------------------------------------------
-
-#include "wx/defs.h" // everybody should include this
-#include "wx/chartype.h" // for wxChar
-#include "wx/wxcrtbase.h" // for wxStrlen() etc.
-
-#include
-
-// ---------------------------------------------------------------------------
-// macros
-// ---------------------------------------------------------------------------
-
-// implementation only
-#define wxASSERT_VALID_INDEX(i) \
- wxASSERT_MSG( (size_t)(i) <= length(), wxT("invalid index in wxString") )
-
-
-// ----------------------------------------------------------------------------
-// global data
-// ----------------------------------------------------------------------------
-
-// global pointer to empty string
-extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxEmptyString;
-#if wxUSE_UNICODE_UTF8
-// FIXME-UTF8: we should have only one wxEmptyString
-extern WXDLLIMPEXP_DATA_BASE(const wxStringCharType*) wxEmptyStringImpl;
-#endif
-
-
-// ----------------------------------------------------------------------------
-// deal with various build options
-// ----------------------------------------------------------------------------
-
-// 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
-#ifndef wxUSE_STL_BASED_WXSTRING
- #define wxUSE_STL_BASED_WXSTRING wxUSE_STD_STRING
-#endif
-
-// in both cases we need to define wxStdString
-#if wxUSE_STL_BASED_WXSTRING || wxUSE_STD_STRING
-
-#include "wx/beforestd.h"
-#include
-#include "wx/afterstd.h"
-
-// Define this for compatibility only, it is not used any longer.
-typedef std::wstring wxStdWideString;
-
-#if wxUSE_UNICODE_WCHAR
- typedef std::wstring wxStdString;
-#else
- typedef std::string wxStdString;
-#endif
-
-#endif // wxUSE_STL_BASED_WXSTRING || wxUSE_STD_STRING
-
-
-#if wxUSE_STL_BASED_WXSTRING
-
- // we always want ctor from std::string when using std::string internally
- #undef wxUSE_STD_STRING
- #define wxUSE_STD_STRING 1
-
- typedef wxStdString wxStringImpl;
-#else // if !wxUSE_STL_BASED_WXSTRING
-
-// ---------------------------------------------------------------------------
-// string data prepended with some housekeeping info (used by wxString class),
-// is never used directly (but had to be put here to allow inlining)
-// ---------------------------------------------------------------------------
-
-struct WXDLLIMPEXP_BASE wxStringData
-{
- int nRefs; // reference count
- size_t nDataLength, // actual string length
- nAllocLength; // allocated memory size
-
- // mimics declaration 'wxStringCharType data[nAllocLength]'
- wxStringCharType* data() { return reinterpret_cast(this + 1); }
- const wxStringCharType* data() const { return reinterpret_cast(this + 1); }
-
- // empty string has a special ref count so it's never deleted
- bool IsEmpty() const { return (nRefs == -1); }
- bool IsShared() const { return (nRefs > 1); }
-
- // lock/unlock
- void Lock() { if ( !IsEmpty() ) nRefs++; }
-
- // VC++ will refuse to inline Unlock but profiling shows that it is wrong
-#if defined(__VISUALC__)
- __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
- void Validate(bool b) { nRefs = (b ? 1 : 0); }
- bool IsValid() const { return (nRefs != 0); }
-};
-
-class WXDLLIMPEXP_BASE wxStringImpl
-{
-public:
- // an 'invalid' value for string index, moved to this place due to a CW bug
- static const size_t npos;
-
-protected:
- // points to data preceded by wxStringData structure with ref count info
- wxStringCharType *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)
-#if wxUSE_UNICODE_UTF8
- void Init() { m_pchData = const_cast(wxEmptyStringImpl); } // FIXME-UTF8
-#else
- void Init() { m_pchData = const_cast(wxEmptyString); }
-#endif
- // initializes the string with (a part of) C-string
- void InitWith(const wxStringCharType *psz, size_t nPos = 0, size_t nLen = npos);
- // as Init, but also frees old data
- void Reinit() { GetStringData()->Unlock(); Init(); }
-
- // memory allocation
- // allocates memory for string of length nLen
- bool AllocBuffer(size_t nLen);
- // effectively copies data to string
- bool AssignCopy(size_t, const wxStringCharType *);
-
- // append a (sub)string
- bool ConcatSelf(size_t nLen, const wxStringCharType *src, size_t nMaxLen);
- bool ConcatSelf(size_t nLen, const wxStringCharType *src)
- { return ConcatSelf(nLen, src, nLen); }
-
- // 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)
- bool CopyBeforeWrite();
- bool AllocBeforeWrite(size_t);
-
- // compatibility with wxString
- bool Alloc(size_t nLen);
-
-public:
- // standard types
- typedef wxStringCharType value_type;
- typedef wxStringCharType char_type;
- typedef size_t size_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
-
- // macro to define the bulk of iterator and const_iterator classes
- #define WX_DEFINE_STRINGIMPL_ITERATOR(iterator_name, ref_type, ptr_type) \
- public: \
- typedef wxStringCharType value_type; \
- typedef ref_type reference; \
- typedef ptr_type pointer; \
- typedef int difference_type; \
- \
- iterator_name() : m_ptr(nullptr) { } \
- iterator_name(pointer ptr) : m_ptr(ptr) { } \
- \
- reference operator*() const { return *m_ptr; } \
- \
- iterator_name& operator++() { m_ptr++; return *this; } \
- iterator_name operator++(int) \
- { \
- const iterator_name tmp(*this); \
- m_ptr++; \
- return tmp; \
- } \
- \
- iterator_name& operator--() { m_ptr--; return *this; } \
- iterator_name operator--(int) \
- { \
- const iterator_name tmp(*this); \
- m_ptr--; \
- return tmp; \
- } \
- \
- iterator_name operator+(ptrdiff_t n) const \
- { return iterator_name(m_ptr + n); } \
- iterator_name operator-(ptrdiff_t n) const \
- { return iterator_name(m_ptr - n); } \
- iterator_name& operator+=(ptrdiff_t n) \
- { m_ptr += n; return *this; } \
- iterator_name& operator-=(ptrdiff_t n) \
- { m_ptr -= n; return *this; } \
- \
- difference_type operator-(const iterator_name& i) const \
- { return m_ptr - i.m_ptr; } \
- \
- bool operator==(const iterator_name& i) const \
- { return m_ptr == i.m_ptr; } \
- bool operator!=(const iterator_name& i) const \
- { return m_ptr != i.m_ptr; } \
- \
- bool operator<(const iterator_name& i) const \
- { return m_ptr < i.m_ptr; } \
- bool operator>(const iterator_name& i) const \
- { return m_ptr > i.m_ptr; } \
- bool operator<=(const iterator_name& i) const \
- { return m_ptr <= i.m_ptr; } \
- bool operator>=(const iterator_name& i) const \
- { return m_ptr >= i.m_ptr; } \
- \
- private: \
- /* for wxStringImpl use only */ \
- pointer GetPtr() const { return m_ptr; } \
- \
- friend class wxStringImpl; \
- \
- pointer m_ptr
-
- // we need to declare const_iterator in wxStringImpl scope, the friend
- // declaration inside iterator class itself is not enough, or at least not
- // for g++ 3.4 (g++ 4 is ok)
- class WXDLLIMPEXP_FWD_BASE const_iterator;
-
- class WXDLLIMPEXP_BASE iterator
- {
- WX_DEFINE_STRINGIMPL_ITERATOR(iterator,
- wxStringCharType&,
- wxStringCharType*);
-
- friend class const_iterator;
- };
-
- class WXDLLIMPEXP_BASE const_iterator
- {
- public:
- const_iterator(iterator i) : m_ptr(i.m_ptr) { }
-
- WX_DEFINE_STRINGIMPL_ITERATOR(const_iterator,
- const wxStringCharType&,
- const wxStringCharType*);
- };
-
- #undef WX_DEFINE_STRINGIMPL_ITERATOR
-
-
- // constructors and destructor
- // ctor for an empty string
- wxStringImpl() { Init(); }
- // copy ctor
- wxStringImpl(const wxStringImpl& stringSrc)
- {
- wxASSERT_MSG( stringSrc.GetStringData()->IsValid(),
- wxT("did you forget to call UngetWriteBuf()?") );
-
- if ( stringSrc.empty() ) {
- // 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
- wxStringImpl(size_type nRepeat, wxStringCharType ch);
- // ctor takes first nLength characters from C string
- // (default value of npos means take all the string)
- wxStringImpl(const wxStringCharType *psz)
- { InitWith(psz, 0, npos); }
- wxStringImpl(const wxStringCharType *psz, size_t nLength)
- { InitWith(psz, 0, nLength); }
- // take nLen chars starting at nPos
- wxStringImpl(const wxStringImpl& str, size_t nPos, size_t nLen)
- {
- wxASSERT_MSG( str.GetStringData()->IsValid(),
- 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);
- }
- // take everything between start and end
- wxStringImpl(const_iterator start, const_iterator end);
-
-
- // ctor from and conversion to std::string
-#if wxUSE_STD_STRING
- wxStringImpl(const wxStdString& impl)
- { InitWith(impl.c_str(), 0, impl.length()); }
-
- operator wxStdString() const
- { return wxStdString(c_str(), length()); }
-#endif
-
-#if defined(__VISUALC__)
- // 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()
- {
- GetStringData()->Unlock();
- }
-
-#if defined(__VISUALC__)
- #pragma warning(pop)
-#endif
-
- // overloaded assignment
- // from another wxString
- wxStringImpl& operator=(const wxStringImpl& stringSrc);
- // from a character
- wxStringImpl& operator=(wxStringCharType ch);
- // from a C string
- wxStringImpl& operator=(const wxStringCharType *psz);
-
- // return the length of the string
- size_type length() const { return GetStringData()->nDataLength; }
- // return the length of the string
- size_type size() const { return length(); }
- // return the maximum size of the string
- size_type max_size() const { return npos; }
- // resize the string, filling the space with c if c != 0
- void resize(size_t nSize, wxStringCharType ch = '\0');
- // delete the contents of the string
- void clear() { erase(0, npos); }
- // returns true if the string is empty
- bool empty() const { return length() == 0; }
- // inform string about planned change in size
- void reserve(size_t sz) { Alloc(sz); }
- size_type capacity() const { return GetStringData()->nAllocLength; }
-
- // 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 );
- CopyBeforeWrite();
- return m_pchData[n];
- } // FIXME-UTF8: not useful for us...?
-
- // lib.string.modifiers
- // append elements str[pos], ..., str[pos+n]
- wxStringImpl& append(const wxStringImpl& str, size_t pos, size_t n)
- {
- wxASSERT(pos <= str.length());
- ConcatSelf(n, str.c_str() + pos, str.length() - pos);
- return *this;
- }
- // append a string
- wxStringImpl& append(const wxStringImpl& str)
- { ConcatSelf(str.length(), str.c_str()); return *this; }
- // append first n (or all if n == npos) characters of sz
- wxStringImpl& append(const wxStringCharType *sz)
- { ConcatSelf(wxStrlen(sz), sz); return *this; }
- wxStringImpl& append(const wxStringCharType *sz, size_t n)
- { ConcatSelf(n, sz); return *this; }
- // append n copies of ch
- wxStringImpl& append(size_t n, wxStringCharType ch);
- // append from first to last
- wxStringImpl& append(const_iterator first, const_iterator last)
- { ConcatSelf(last - first, first.GetPtr()); return *this; }
-
- // same as `this_string = str'
- wxStringImpl& assign(const wxStringImpl& str)
- { return *this = str; }
- // same as ` = str[pos..pos + n]
- wxStringImpl& assign(const wxStringImpl& str, size_t pos, size_t n)
- { return replace(0, npos, str, pos, n); }
- // same as `= first n (or all if n == npos) characters of sz'
- wxStringImpl& assign(const wxStringCharType *sz)
- { return replace(0, npos, sz, wxStrlen(sz)); }
- wxStringImpl& assign(const wxStringCharType *sz, size_t n)
- { return replace(0, npos, sz, n); }
- // same as `= n copies of ch'
- wxStringImpl& assign(size_t n, wxStringCharType ch)
- { return replace(0, npos, n, ch); }
- // assign from first to last
- wxStringImpl& assign(const_iterator first, const_iterator last)
- { return replace(begin(), end(), first, last); }
-
- // first valid index position
- const_iterator begin() const { return m_pchData; }
- iterator begin();
- // position one after the last valid one
- const_iterator end() const { return m_pchData + length(); }
- iterator end();
-
- // insert another string
- wxStringImpl& insert(size_t nPos, const wxStringImpl& str)
- {
- wxASSERT( str.GetStringData()->IsValid() );
- return insert(nPos, str.c_str(), str.length());
- }
- // insert n chars of str starting at nStart (in str)
- wxStringImpl& insert(size_t nPos, const wxStringImpl& str, size_t nStart, size_t n)
- {
- wxASSERT( str.GetStringData()->IsValid() );
- wxASSERT( nStart < str.length() );
- size_t strLen = str.length() - nStart;
- n = strLen < n ? strLen : n;
- return insert(nPos, str.c_str() + nStart, n);
- }
- // insert first n (or all if n == npos) characters of sz
- wxStringImpl& insert(size_t nPos, const wxStringCharType *sz, size_t n = npos);
- // insert n copies of ch
- wxStringImpl& insert(size_t nPos, size_t n, wxStringCharType ch)
- { return insert(nPos, wxStringImpl(n, ch)); }
- iterator insert(iterator it, wxStringCharType ch)
- { size_t idx = it - begin(); insert(idx, 1, ch); return begin() + idx; }
- void insert(iterator it, const_iterator first, const_iterator last)
- { insert(it - begin(), first.GetPtr(), last - first); }
- void insert(iterator it, size_type n, wxStringCharType ch)
- { insert(it - begin(), n, ch); }
-
- // delete characters from nStart to nStart + nLen
- wxStringImpl& erase(size_type pos = 0, size_type n = npos);
- iterator erase(iterator first, iterator last)
- {
- size_t idx = first - begin();
- erase(idx, last - first);
- return begin() + idx;
- }
- iterator erase(iterator first);
-
- // explicit conversion to C string (use this with printf()!)
- const wxStringCharType* c_str() const { return m_pchData; }
- const wxStringCharType* data() const { return m_pchData; }
-
- // replaces the substring of length nLen starting at nStart
- wxStringImpl& replace(size_t nStart, size_t nLen, const wxStringCharType* sz)
- { return replace(nStart, nLen, sz, npos); }
- // replaces the substring of length nLen starting at nStart
- wxStringImpl& replace(size_t nStart, size_t nLen, const wxStringImpl& str)
- { return replace(nStart, nLen, str.c_str(), str.length()); }
- // replaces the substring with nCount copies of ch
- wxStringImpl& replace(size_t nStart, size_t nLen,
- size_t nCount, wxStringCharType ch)
- { return replace(nStart, nLen, wxStringImpl(nCount, ch)); }
- // replaces a substring with another substring
- wxStringImpl& replace(size_t nStart, size_t nLen,
- const wxStringImpl& str, size_t nStart2, size_t nLen2)
- { return replace(nStart, nLen, str.substr(nStart2, nLen2)); }
- // replaces the substring with first nCount chars of sz
- wxStringImpl& replace(size_t nStart, size_t nLen,
- const wxStringCharType* sz, size_t nCount);
-
- wxStringImpl& replace(iterator first, iterator last, const_pointer s)
- { return replace(first - begin(), last - first, s); }
- wxStringImpl& replace(iterator first, iterator last, const_pointer s,
- size_type n)
- { return replace(first - begin(), last - first, s, n); }
- wxStringImpl& replace(iterator first, iterator last, const wxStringImpl& s)
- { return replace(first - begin(), last - first, s); }
- wxStringImpl& replace(iterator first, iterator last, size_type n, wxStringCharType c)
- { return replace(first - begin(), last - first, n, c); }
- wxStringImpl& replace(iterator first, iterator last,
- const_iterator first1, const_iterator last1)
- { return replace(first - begin(), last - first, first1.GetPtr(), last1 - first1); }
-
- // swap two strings
- void swap(wxStringImpl& str);
-
- // All find() functions take the nStart argument which specifies the
- // position to start the search on, the default value is 0. All functions
- // return npos if there were no match.
-
- // find a substring
- size_t find(const wxStringImpl& str, size_t nStart = 0) const;
-
- // find first n characters of sz
- size_t find(const wxStringCharType* sz, size_t nStart = 0, size_t n = npos) const;
-
- // find the first occurrence of character ch after nStart
- size_t find(wxStringCharType ch, size_t nStart = 0) const;
-
- // rfind() family is exactly like find() but works right to left
-
- // as find, but from the end
- size_t rfind(const wxStringImpl& str, size_t nStart = npos) const;
-
- // as find, but from the end
- size_t rfind(const wxStringCharType* sz, size_t nStart = npos,
- size_t n = npos) const;
- // as find, but from the end
- size_t rfind(wxStringCharType ch, size_t nStart = npos) const;
-
- size_type copy(wxStringCharType* s, size_type n, size_type pos = 0);
-
- // substring extraction
- wxStringImpl substr(size_t nStart = 0, size_t nLen = npos) const;
-
- // string += string
- wxStringImpl& operator+=(const wxStringImpl& s) { return append(s); }
- // string += C string
- wxStringImpl& operator+=(const wxStringCharType *psz) { return append(psz); }
- // string += char
- wxStringImpl& operator+=(wxStringCharType ch) { return append(1, ch); }
-
- // helpers for wxStringBuffer and wxStringBufferLength
- wxStringCharType *DoGetWriteBuf(size_t nLen);
- void DoUngetWriteBuf();
- void DoUngetWriteBuf(size_t nLen);
-
- friend class WXDLLIMPEXP_FWD_BASE wxString;
-};
-
-#endif // !wxUSE_STL_BASED_WXSTRING
-
-// don't pollute the library user's name space
-#undef wxASSERT_VALID_INDEX
-
-#endif // _WX_WXSTRINGIMPL_H__
diff --git a/include/wx/stringops.h b/include/wx/stringops.h
index f3b94da46a..7ed8cf8b20 100644
--- a/include/wx/stringops.h
+++ b/include/wx/stringops.h
@@ -12,10 +12,13 @@
#define _WX_WXSTRINGOPS_H__
#include "wx/chartype.h"
-#include "wx/stringimpl.h"
#include "wx/unichar.h"
#include "wx/buffer.h"
+#include "wx/beforestd.h"
+#include
+#include "wx/afterstd.h"
+
// This header contains wxStringOperations "namespace" class that implements
// elementary operations on string data as static methods; wxString methods and
// iterators are implemented in terms of it. Two implementations are available,
@@ -76,7 +79,7 @@ struct WXDLLIMPEXP_BASE wxStringOperationsWchar
static bool IsSingleCodeUnitCharacter(const wxUniChar&) { return true; }
#endif
- static wxUniChar DecodeChar(const wxStringImpl::const_iterator& i)
+ static wxUniChar DecodeChar(const std::wstring::const_iterator& i)
{ return *i; }
};
#endif // wxUSE_UNICODE_WCHAR
@@ -87,7 +90,7 @@ struct WXDLLIMPEXP_BASE wxStringOperationsUtf8
{
// checks correctness of UTF-8 sequence
static bool IsValidUtf8String(const char *c,
- size_t len = wxStringImpl::npos);
+ size_t len = std::string::npos);
static bool IsValidUtf8LeadByte(unsigned char c)
{
return (c <= 0x7F) || (c >= 0xC2 && c <= 0xF4);
@@ -181,7 +184,7 @@ struct WXDLLIMPEXP_BASE wxStringOperationsUtf8
}
// decodes single UTF-8 character from UTF-8 string
- static wxUniChar DecodeChar(wxStringImpl::const_iterator i)
+ static wxUniChar DecodeChar(std::string::const_iterator i)
{
if ( (unsigned char)*i < 0x80 )
return (int)*i;
@@ -189,7 +192,7 @@ struct WXDLLIMPEXP_BASE wxStringOperationsUtf8
}
private:
- static wxUniChar DecodeNonAsciiChar(wxStringImpl::const_iterator i);
+ static wxUniChar DecodeNonAsciiChar(std::string::const_iterator i);
};
#endif // wxUSE_UNICODE_UTF8
diff --git a/include/wx/strvararg.h b/include/wx/strvararg.h
index 45f009739c..8e319d18e0 100644
--- a/include/wx/strvararg.h
+++ b/include/wx/strvararg.h
@@ -18,8 +18,13 @@
#include "wx/buffer.h"
#include "wx/unichar.h"
+#include
#include
+#ifdef __cpp_lib_string_view
+ #include
+#endif // __cpp_lib_string_view
+
class WXDLLIMPEXP_FWD_BASE wxCStrData;
class WXDLLIMPEXP_FWD_BASE wxString;
@@ -721,18 +726,7 @@ WX_ARG_NORMALIZER_FORWARD(const wxCharBuffer&, const char*);
WX_ARG_NORMALIZER_FORWARD(wxWCharBuffer, const wchar_t*);
WX_ARG_NORMALIZER_FORWARD(const wxWCharBuffer&, const wchar_t*);
-// versions for std::[w]string:
-#if wxUSE_STD_STRING
-
-#include "wx/stringimpl.h"
-
-// And also string_view, if we have it (notice that was included from
-// wx/stringimpl.h above, so __cpp_lib_string_view should be defined if it's
-// supported).
-#ifdef __cpp_lib_string_view
- #include
-#endif // __cpp_lib_string_view
-
+// versions for std::[w]string and string_view, if we have it.
#if !wxUSE_UTF8_LOCALE_ONLY
#ifndef wxNO_IMPLICIT_WXSTRING_ENCODING
template<>
@@ -813,8 +807,6 @@ WX_ARG_NORMALIZER_FORWARD(std::string_view, const std::string_view&);
#endif
WX_ARG_NORMALIZER_FORWARD(std::wstring, const std::wstring&);
-#endif // wxUSE_STD_STRING
-
// versions for wxUniChar, wxUniCharRef:
// (this is same for UTF-8 and Wchar builds, we just convert to wchar_t)
diff --git a/include/wx/unichar.h b/include/wx/unichar.h
index c42285007b..19a0c6d1fb 100644
--- a/include/wx/unichar.h
+++ b/include/wx/unichar.h
@@ -12,14 +12,9 @@
#include "wx/defs.h"
#include "wx/chartype.h"
-#include "wx/stringimpl.h"
-// We need to get std::swap() declaration in order to specialize it below and
-// it is declared in different headers for C++98 and C++11. Instead of testing
-// which one is being used, just include both of them as it's simpler and less
-// error-prone.
-#include // std::swap() for C++98
-#include // std::swap() for C++11
+#include
+#include // std::swap() which we specialize below
class WXDLLIMPEXP_FWD_BASE wxUniCharRef;
class WXDLLIMPEXP_FWD_BASE wxString;
@@ -210,7 +205,11 @@ private:
class WXDLLIMPEXP_BASE wxUniCharRef
{
private:
- typedef wxStringImpl::iterator iterator;
+#if wxUSE_UNICODE_UTF8
+ typedef std::string::iterator iterator;
+#else
+ typedef std::wstring::iterator iterator;
+#endif
// create the reference
#if wxUSE_UNICODE_UTF8
diff --git a/include/wx/wxcrtbase.h b/include/wx/wxcrtbase.h
index 2792e96638..f3a204953b 100644
--- a/include/wx/wxcrtbase.h
+++ b/include/wx/wxcrtbase.h
@@ -614,8 +614,8 @@ WXDLLIMPEXP_BASE size_t wxCRT_StrftimeW(wchar_t *s, size_t max,
#ifdef __cplusplus
/* NB: this belongs to wxcrt.h and not this header, but it makes life easier
- * for buffer.h and stringimpl.h (both of which must be included before
- * string.h, which is required by wxcrt.h) to have them here: */
+ * for buffer.h which must be included before string.h, which is required
+ * by wxcrt.h, to have them here: */
/* safe version of strlen() (returns 0 if passed null pointer) */
inline size_t wxStrlen(const char *s) { return s ? wxCRT_StrlenA(s) : 0; }
diff --git a/src/common/descrip.mms b/src/common/descrip.mms
index 8f2748284b..83c901164f 100644
--- a/src/common/descrip.mms
+++ b/src/common/descrip.mms
@@ -175,7 +175,6 @@ OBJECTS1=fs_inet.obj,\
strconv.obj,\
stream.obj,\
string.obj,\
- stringimpl.obj,\
stringops.obj,\
strvararg.obj,\
sysopt.obj
@@ -376,7 +375,6 @@ SOURCES = \
strvararg.cpp,\
sysopt.cpp,\
string.cpp,\
- stringimpl.cpp,\
stringops.cpp,\
tbarbase.cpp,\
textbuf.cpp,\
@@ -615,7 +613,6 @@ stream.obj : stream.cpp
strvararg.obj : strvararg.cpp
sysopt.obj : sysopt.cpp
string.obj : string.cpp
-stringimpl.obj : stringimpl.cpp
stringops.obj : stringops.cpp
tbarbase.obj : tbarbase.cpp
textbuf.obj : textbuf.cpp
diff --git a/src/common/string.cpp b/src/common/string.cpp
index c127e253f3..06c6465db2 100644
--- a/src/common/string.cpp
+++ b/src/common/string.cpp
@@ -79,6 +79,11 @@ UntypedBufferData *GetUntypedNullData()
//According to STL _must_ be a -1 size_t
const size_t wxString::npos = (size_t) -1;
+// FIXME-UTF8: get rid of this, have only one wxEmptyString
+#if wxUSE_UNICODE_UTF8
+const wxStringCharType WXDLLIMPEXP_BASE *wxEmptyStringImpl = "";
+#endif
+const wxChar WXDLLIMPEXP_BASE *wxEmptyString = wxT("");
#if wxUSE_STRING_POS_CACHE
wxTHREAD_SPECIFIC_DECL wxString::Cache wxString::ms_cache;
diff --git a/src/common/stringimpl.cpp b/src/common/stringimpl.cpp
deleted file mode 100644
index 0ab6b7925c..0000000000
--- a/src/common/stringimpl.cpp
+++ /dev/null
@@ -1,791 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name: src/common/stringimpl.cpp
-// Purpose: wxString class
-// Author: Vadim Zeitlin, Ryan Norton
-// Modified by:
-// Created: 29/01/98
-// Copyright: (c) 1998 Vadim Zeitlin
-// (c) 2004 Ryan Norton
-// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-/*
- * About ref counting:
- * 1) all empty strings use g_strEmpty, nRefs = -1 (set in Init())
- * 2) AllocBuffer() sets nRefs to 1, Lock() increments it by one
- * 3) Unlock() decrements nRefs and frees memory if it goes to 0
- */
-
-// ===========================================================================
-// headers, declarations, constants
-// ===========================================================================
-
-// For compilers that support precompilation, includes "wx.h".
-#include "wx/wxprec.h"
-
-
-#ifndef WX_PRECOMP
- #include "wx/stringimpl.h"
- #include "wx/wxcrt.h"
-#endif
-
-#include
-
-#include
-
-#include
-#include
-
-// ---------------------------------------------------------------------------
-// static class variables definition
-// ---------------------------------------------------------------------------
-
-#if !wxUSE_STL_BASED_WXSTRING
-//According to STL _must_ be a -1 size_t
-const size_t wxStringImpl::npos = (size_t) -1;
-#endif
-
-// ----------------------------------------------------------------------------
-// static data
-// ----------------------------------------------------------------------------
-
-#if wxUSE_STL_BASED_WXSTRING
-
-// FIXME-UTF8: get rid of this, have only one wxEmptyString
-#if wxUSE_UNICODE_UTF8
-const wxStringCharType WXDLLIMPEXP_BASE *wxEmptyStringImpl = "";
-#endif
-const wxChar WXDLLIMPEXP_BASE *wxEmptyString = wxT("");
-
-#else
-
-// allocating extra space for each string consumes more memory but speeds up
-// the concatenation operations (nLen is the current string's length)
-// NB: EXTRA_ALLOC must be >= 0!
-#define EXTRA_ALLOC (19 - nLen % 16)
-
-// string handling functions used by wxString:
-#if wxUSE_UNICODE_UTF8
- #define wxStringMemcpy memcpy
- #define wxStringMemcmp memcmp
- #define wxStringMemchr memchr
-#else
- #define wxStringMemcpy wxTmemcpy
- #define wxStringMemcmp wxTmemcmp
- #define wxStringMemchr wxTmemchr
-#endif
-
-// for an empty string, GetStringData() will return this address: this
-// structure has the same layout as wxStringData and it's data() method will
-// return the empty string (dummy pointer)
-static const struct
-{
- wxStringData data;
- wxStringCharType dummy;
-} g_strEmpty = { {-1, 0, 0}, wxT('\0') };
-
-// empty C style string: points to 'string data' byte of g_strEmpty
-#if wxUSE_UNICODE_UTF8
-// FIXME-UTF8: get rid of this, have only one wxEmptyString
-const wxStringCharType WXDLLIMPEXP_BASE *wxEmptyStringImpl = &g_strEmpty.dummy;
-const wxChar WXDLLIMPEXP_BASE *wxEmptyString = wxT("");
-#else
-const wxStringCharType WXDLLIMPEXP_BASE *wxEmptyString = &g_strEmpty.dummy;
-#endif
-
-#endif
-
-
-#if !wxUSE_STL_BASED_WXSTRING
-
-// ----------------------------------------------------------------------------
-// private classes
-// ----------------------------------------------------------------------------
-
-// this small class is used to gather statistics for performance tuning
-
-// uncomment this to enable gathering of some statistics about wxString
-// efficiency
-//#define WXSTRING_STATISTICS
-
-#ifdef WXSTRING_STATISTICS
- class Averager
- {
- public:
- Averager(const wxStringCharType *sz) { m_sz = sz; m_nTotal = m_nCount = 0; }
- ~Averager()
- {
- wxPrintf("wxString %s: total = %lu, average = %f\n",
- m_sz, m_nTotal, ((float)m_nTotal)/m_nCount);
- }
-
- void Add(size_t n) { m_nTotal += n; m_nCount++; }
-
- private:
- unsigned long m_nCount, m_nTotal;
- const wxStringCharType *m_sz;
- } g_averageLength("allocation size"),
- g_averageSummandLength("summand length"),
- g_averageConcatHit("hit probability in concat"),
- g_averageInitialLength("initial string length");
-
- #define STATISTICS_ADD(av, val) g_average##av.Add(val)
-#else
- #define STATISTICS_ADD(av, val)
-#endif // WXSTRING_STATISTICS
-
-// ===========================================================================
-// wxStringData class deallocation
-// ===========================================================================
-
-#if defined(__VISUALC__) && defined(_MT) && !defined(_DLL)
-# pragma message (__FILE__ ": building with Multithreaded non DLL runtime has a performance impact on wxString!")
-void wxStringData::Free()
-{
- free(this);
-}
-#endif
-
-// ===========================================================================
-// wxStringImpl
-// ===========================================================================
-
-// takes nLength elements of psz starting at nPos
-void wxStringImpl::InitWith(const wxStringCharType *psz,
- size_t nPos, size_t nLength)
-{
- Init();
-
- // if the length is not given, assume the string to be NUL terminated
- if ( nLength == npos ) {
- wxASSERT_MSG( nPos <= wxStrlen(psz), wxT("index out of bounds") );
-
- nLength = wxStrlen(psz + nPos);
- }
-
- STATISTICS_ADD(InitialLength, nLength);
-
- if ( nLength > 0 ) {
- // trailing '\0' is written in AllocBuffer()
- if ( !AllocBuffer(nLength) ) {
- wxFAIL_MSG( wxT("out of memory in wxStringImpl::InitWith") );
- return;
- }
- wxStringMemcpy(m_pchData, psz + nPos, nLength);
- }
-}
-
-wxStringImpl::wxStringImpl(const_iterator first, const_iterator last)
-{
- if ( last >= first )
- {
- InitWith(first.GetPtr(), 0, last - first);
- }
- else
- {
- wxFAIL_MSG( wxT("first must be before last") );
- Init();
- }
-}
-
-wxStringImpl::wxStringImpl(size_type n, wxStringCharType ch)
-{
- Init();
- append(n, ch);
-}
-
-// ---------------------------------------------------------------------------
-// memory allocation
-// ---------------------------------------------------------------------------
-
-// allocates memory needed to store a C string of length nLen
-bool wxStringImpl::AllocBuffer(size_t nLen)
-{
- // allocating 0 sized buffer doesn't make sense, all empty strings should
- // reuse g_strEmpty
- wxASSERT( nLen > 0 );
-
- // make sure that we don't overflow
- wxCHECK( nLen < (INT_MAX / sizeof(wxStringCharType)) -
- (sizeof(wxStringData) + EXTRA_ALLOC + 1), false );
-
- STATISTICS_ADD(Length, nLen);
-
- // allocate memory:
- // 1) one extra character for '\0' termination
- // 2) sizeof(wxStringData) for housekeeping info
- wxStringData* pData = (wxStringData*)
- malloc(sizeof(wxStringData) + (nLen + EXTRA_ALLOC + 1)*sizeof(wxStringCharType));
-
- if ( pData == nullptr ) {
- // allocation failures are handled by the caller
- return false;
- }
-
- pData->nRefs = 1;
- pData->nDataLength = nLen;
- pData->nAllocLength = nLen + EXTRA_ALLOC;
- m_pchData = pData->data(); // data starts after wxStringData
- m_pchData[nLen] = wxT('\0');
- return true;
-}
-
-// must be called before changing this string
-bool wxStringImpl::CopyBeforeWrite()
-{
- wxStringData* pData = GetStringData();
-
- if ( pData->IsShared() ) {
- pData->Unlock(); // memory not freed because shared
- size_t nLen = pData->nDataLength;
- if ( !AllocBuffer(nLen) ) {
- // allocation failures are handled by the caller
- return false;
- }
- wxStringMemcpy(m_pchData, pData->data(), nLen);
- }
-
- wxASSERT( !GetStringData()->IsShared() ); // we must be the only owner
-
- return true;
-}
-
-// must be called before replacing contents of this string
-bool wxStringImpl::AllocBeforeWrite(size_t nLen)
-{
- wxASSERT( nLen != 0 ); // doesn't make any sense
-
- // must not share string and must have enough space
- wxStringData* pData = GetStringData();
- if ( pData->IsShared() || pData->IsEmpty() ) {
- // can't work with old buffer, get new one
- pData->Unlock();
- if ( !AllocBuffer(nLen) ) {
- // allocation failures are handled by the caller
- return false;
- }
- }
- else {
- if ( nLen > pData->nAllocLength ) {
- // realloc the buffer instead of calling malloc() again, this is more
- // efficient
- STATISTICS_ADD(Length, nLen);
-
- nLen += EXTRA_ALLOC;
-
- pData = (wxStringData*)
- realloc(pData,
- sizeof(wxStringData) + (nLen + 1)*sizeof(wxStringCharType));
-
- if ( pData == nullptr ) {
- // allocation failures are handled by the caller
- // keep previous data since reallocation failed
- return false;
- }
-
- pData->nAllocLength = nLen;
- m_pchData = pData->data();
- }
- }
-
- wxASSERT( !GetStringData()->IsShared() ); // we must be the only owner
-
- // it doesn't really matter what the string length is as it's going to be
- // overwritten later but, for extra safety, set it to 0 for now as we may
- // have some junk in m_pchData
- GetStringData()->nDataLength = 0;
-
- return true;
-}
-
-wxStringImpl& wxStringImpl::append(size_t n, wxStringCharType ch)
-{
- size_type len = length();
-
- if ( !Alloc(len + n) || !CopyBeforeWrite() ) {
- wxFAIL_MSG( wxT("out of memory in wxStringImpl::append") );
- return *this;
- }
- GetStringData()->nDataLength = len + n;
- m_pchData[len + n] = '\0';
- for ( size_t i = 0; i < n; ++i )
- m_pchData[len + i] = ch;
- return *this;
-}
-
-void wxStringImpl::resize(size_t nSize, wxStringCharType ch)
-{
- size_t len = length();
-
- if ( nSize < len )
- {
- erase(begin() + nSize, end());
- }
- else if ( nSize > len )
- {
- append(nSize - len, ch);
- }
- //else: we have exactly the specified length, nothing to do
-}
-
-// allocate enough memory for nLen characters
-bool wxStringImpl::Alloc(size_t nLen)
-{
- wxStringData *pData = GetStringData();
- if ( pData->nAllocLength <= nLen ) {
- if ( pData->IsEmpty() ) {
- STATISTICS_ADD(Length, nLen);
-
- nLen += EXTRA_ALLOC;
-
- pData = (wxStringData *)
- malloc(sizeof(wxStringData) + (nLen + 1)*sizeof(wxStringCharType));
-
- if ( pData == nullptr ) {
- // allocation failure handled by caller
- return false;
- }
-
- pData->nRefs = 1;
- pData->nDataLength = 0;
- pData->nAllocLength = nLen;
- m_pchData = pData->data(); // data starts after wxStringData
- m_pchData[0u] = wxT('\0');
- }
- else if ( pData->IsShared() ) {
- pData->Unlock(); // memory not freed because shared
- size_t nOldLen = pData->nDataLength;
- if ( !AllocBuffer(nLen) ) {
- // allocation failure handled by caller
- return false;
- }
- // +1 to copy the terminator, too
- memcpy(m_pchData, pData->data(), (nOldLen+1)*sizeof(wxStringCharType));
- GetStringData()->nDataLength = nOldLen;
- }
- else {
- nLen += EXTRA_ALLOC;
-
- pData = (wxStringData *)
- realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(wxStringCharType));
-
- if ( pData == nullptr ) {
- // allocation failure handled by caller
- // keep previous data since reallocation failed
- return false;
- }
-
- // it's not important if the pointer changed or not (the check for this
- // is not faster than assigning to m_pchData in all cases)
- pData->nAllocLength = nLen;
- m_pchData = pData->data();
- }
- }
- //else: we've already got enough
- return true;
-}
-
-wxStringImpl::iterator wxStringImpl::begin()
-{
- if ( !empty() )
- CopyBeforeWrite();
- return m_pchData;
-}
-
-wxStringImpl::iterator wxStringImpl::end()
-{
- if ( !empty() )
- CopyBeforeWrite();
- return m_pchData + length();
-}
-
-wxStringImpl::iterator wxStringImpl::erase(iterator it)
-{
- size_type idx = it - begin();
- erase(idx, 1);
- return begin() + idx;
-}
-
-wxStringImpl& wxStringImpl::erase(size_t nStart, size_t nLen)
-{
- wxASSERT(nStart <= length());
- size_t strLen = length() - nStart;
- // delete nLen or up to the end of the string characters
- nLen = strLen < nLen ? strLen : nLen;
- wxStringImpl strTmp(c_str(), nStart);
- strTmp.append(c_str() + nStart + nLen, length() - nStart - nLen);
-
- swap(strTmp);
- return *this;
-}
-
-wxStringImpl& wxStringImpl::insert(size_t nPos,
- const wxStringCharType *sz, size_t n)
-{
- wxASSERT( nPos <= length() );
-
- if ( n == npos ) n = wxStrlen(sz);
- if ( n == 0 ) return *this;
-
- if ( !Alloc(length() + n) || !CopyBeforeWrite() ) {
- wxFAIL_MSG( wxT("out of memory in wxStringImpl::insert") );
- return *this;
- }
-
- memmove(m_pchData + nPos + n, m_pchData + nPos,
- (length() - nPos) * sizeof(wxStringCharType));
- memcpy(m_pchData + nPos, sz, n * sizeof(wxStringCharType));
- GetStringData()->nDataLength = length() + n;
- m_pchData[length()] = '\0';
-
- return *this;
-}
-
-void wxStringImpl::swap(wxStringImpl& str)
-{
- wxStringCharType* tmp = str.m_pchData;
- str.m_pchData = m_pchData;
- m_pchData = tmp;
-}
-
-size_t wxStringImpl::find(const wxStringImpl& str, size_t nStart) const
-{
- // deal with the special case of empty string first
- const size_t nLen = length();
- const size_t nLenOther = str.length();
-
- if ( !nLenOther )
- {
- // empty string is a substring of anything
- return 0;
- }
-
- if ( !nLen )
- {
- // the other string is non empty so can't be our substring
- return npos;
- }
-
- wxASSERT( str.GetStringData()->IsValid() );
- wxASSERT( nStart <= nLen );
-
- const wxStringCharType * const other = str.c_str();
-
- // anchor
- const wxStringCharType* p =
- (const wxStringCharType*)wxStringMemchr(c_str() + nStart,
- *other,
- nLen - nStart);
-
- if ( !p )
- return npos;
-
- while ( p - c_str() + nLenOther <= nLen &&
- wxStringMemcmp(p, other, nLenOther) )
- {
- p++;
-
- // anchor again
- p = (const wxStringCharType*)
- wxStringMemchr(p, *other, nLen - (p - c_str()));
-
- if ( !p )
- return npos;
- }
-
- return p - c_str() + nLenOther <= nLen ? p - c_str() : npos;
-}
-
-size_t wxStringImpl::find(const wxStringCharType* sz,
- size_t nStart, size_t n) const
-{
- return find(wxStringImpl(sz, n), nStart);
-}
-
-size_t wxStringImpl::find(wxStringCharType ch, size_t nStart) const
-{
- wxASSERT( nStart <= length() );
-
- const wxStringCharType *p = (const wxStringCharType*)
- wxStringMemchr(c_str() + nStart, ch, length() - nStart);
-
- return p == nullptr ? npos : p - c_str();
-}
-
-size_t wxStringImpl::rfind(const wxStringImpl& str, size_t nStart) const
-{
- wxASSERT( str.GetStringData()->IsValid() );
- wxASSERT( nStart == npos || nStart <= length() );
-
- if ( length() >= str.length() )
- {
- // avoids a corner case later
- if ( empty() && str.empty() )
- return 0;
-
- // "top" is the point where search starts from
- size_t top = length() - str.length();
-
- if ( nStart == npos )
- nStart = length() - 1;
- if ( nStart < top )
- top = nStart;
-
- const wxStringCharType *cursor = c_str() + top;
- do
- {
- if ( wxStringMemcmp(cursor, str.c_str(), str.length()) == 0 )
- {
- return cursor - c_str();
- }
- } while ( cursor-- > c_str() );
- }
-
- return npos;
-}
-
-size_t wxStringImpl::rfind(const wxStringCharType* sz,
- size_t nStart, size_t n) const
-{
- return rfind(wxStringImpl(sz, n), nStart);
-}
-
-size_t wxStringImpl::rfind(wxStringCharType ch, size_t nStart) const
-{
- if ( nStart == npos )
- {
- nStart = length();
- }
- else
- {
- wxASSERT( nStart <= length() );
- }
-
- const wxStringCharType *actual;
- for ( actual = c_str() + ( nStart == npos ? length() : nStart + 1 );
- actual > c_str(); --actual )
- {
- if ( *(actual - 1) == ch )
- return (actual - 1) - c_str();
- }
-
- return npos;
-}
-
-wxStringImpl& wxStringImpl::replace(size_t nStart, size_t nLen,
- const wxStringCharType *sz, size_t nCount)
-{
- // check and adjust parameters
- const size_t lenOld = length();
-
- wxASSERT_MSG( nStart <= lenOld,
- wxT("index out of bounds in wxStringImpl::replace") );
- size_t nEnd = nStart + nLen;
- if ( nLen > lenOld - nStart )
- {
- // nLen may be out of range, as it can be npos, just clump it down
- nLen = lenOld - nStart;
- nEnd = lenOld;
- }
-
- if ( nCount == npos )
- nCount = wxStrlen(sz);
-
- // build the new string from 3 pieces: part of this string before nStart,
- // the new substring and the part of this string after nStart+nLen
- wxStringImpl tmp;
- const size_t lenNew = lenOld + nCount - nLen;
- if ( lenNew )
- {
- tmp.AllocBuffer(lenOld + nCount - nLen);
-
- wxStringCharType *dst = tmp.m_pchData;
- memcpy(dst, m_pchData, nStart*sizeof(wxStringCharType));
- dst += nStart;
-
- memcpy(dst, sz, nCount*sizeof(wxStringCharType));
- dst += nCount;
-
- memcpy(dst, m_pchData + nEnd, (lenOld - nEnd)*sizeof(wxStringCharType));
- }
-
- // and replace this string contents with the new one
- swap(tmp);
- return *this;
-}
-
-wxStringImpl wxStringImpl::substr(size_t nStart, size_t nLen) const
-{
- if ( nLen == npos )
- nLen = length() - nStart;
- return wxStringImpl(*this, nStart, nLen);
-}
-
-// assigns one string to another
-wxStringImpl& wxStringImpl::operator=(const wxStringImpl& stringSrc)
-{
- wxASSERT( stringSrc.GetStringData()->IsValid() );
-
- // don't copy string over itself
- if ( m_pchData != stringSrc.m_pchData ) {
- if ( stringSrc.GetStringData()->IsEmpty() ) {
- Reinit();
- }
- else {
- // adjust references
- GetStringData()->Unlock();
- m_pchData = stringSrc.m_pchData;
- GetStringData()->Lock();
- }
- }
-
- return *this;
-}
-
-// assigns a single character
-wxStringImpl& wxStringImpl::operator=(wxStringCharType ch)
-{
- wxStringCharType c(ch);
- if ( !AssignCopy(1, &c) ) {
- wxFAIL_MSG( wxT("out of memory in wxStringImpl::operator=(wxStringCharType)") );
- }
- return *this;
-}
-
-// assigns C string
-wxStringImpl& wxStringImpl::operator=(const wxStringCharType *psz)
-{
- if ( !AssignCopy(wxStrlen(psz), psz) ) {
- wxFAIL_MSG( wxT("out of memory in wxStringImpl::operator=(const wxStringCharType *)") );
- }
- return *this;
-}
-
-// helper function: does real copy
-bool wxStringImpl::AssignCopy(size_t nSrcLen,
- const wxStringCharType *pszSrcData)
-{
- if ( nSrcLen == 0 ) {
- Reinit();
- }
- else {
- if ( !AllocBeforeWrite(nSrcLen) ) {
- // allocation failure handled by caller
- return false;
- }
-
- // use memmove() and not memcpy() here as we might be copying from our own
- // buffer in case of assignment such as "s = s.c_str()" (see #11294)
- memmove(m_pchData, pszSrcData, nSrcLen*sizeof(wxStringCharType));
-
- GetStringData()->nDataLength = nSrcLen;
- m_pchData[nSrcLen] = wxT('\0');
- }
- return true;
-}
-
-// ---------------------------------------------------------------------------
-// string concatenation
-// ---------------------------------------------------------------------------
-
-// add something to this string
-bool wxStringImpl::ConcatSelf(size_t nSrcLen,
- const wxStringCharType *pszSrcData,
- size_t nMaxLen)
-{
- STATISTICS_ADD(SummandLength, nSrcLen);
-
- nSrcLen = nSrcLen < nMaxLen ? nSrcLen : nMaxLen;
-
- // concatenating an empty string is a NOP
- if ( nSrcLen > 0 ) {
- wxStringData *pData = GetStringData();
- size_t nLen = pData->nDataLength;
-
- // take special care when appending part of this string to itself: the code
- // below reallocates our buffer and this invalidates pszSrcData pointer so
- // we have to copy it in another temporary string in this case (but avoid
- // doing this unnecessarily)
- if ( pszSrcData >= m_pchData && pszSrcData < m_pchData + nLen )
- {
- wxStringImpl tmp(pszSrcData, nSrcLen);
- return ConcatSelf(nSrcLen, tmp.m_pchData, nSrcLen);
- }
-
- size_t nNewLen = nLen + nSrcLen;
-
- // alloc new buffer if current is too small
- if ( pData->IsShared() ) {
- STATISTICS_ADD(ConcatHit, 0);
-
- // we have to allocate another buffer
- wxStringData* pOldData = GetStringData();
- if ( !AllocBuffer(nNewLen) ) {
- // allocation failure handled by caller
- return false;
- }
- memcpy(m_pchData, pOldData->data(), nLen*sizeof(wxStringCharType));
- pOldData->Unlock();
- }
- else if ( nNewLen > pData->nAllocLength ) {
- STATISTICS_ADD(ConcatHit, 0);
-
- reserve(nNewLen);
- // we have to grow the buffer
- if ( capacity() < nNewLen ) {
- // allocation failure handled by caller
- return false;
- }
- }
- else {
- STATISTICS_ADD(ConcatHit, 1);
-
- // the buffer is already big enough
- }
-
- // should be enough space
- wxASSERT( nNewLen <= GetStringData()->nAllocLength );
-
- // fast concatenation - all is done in our buffer
- memcpy(m_pchData + nLen, pszSrcData, nSrcLen*sizeof(wxStringCharType));
-
- m_pchData[nNewLen] = wxT('\0'); // put terminating '\0'
- GetStringData()->nDataLength = nNewLen; // and fix the length
- }
- //else: the string to append was empty
- return true;
-}
-
-// get the pointer to writable buffer of (at least) nLen bytes
-wxStringCharType *wxStringImpl::DoGetWriteBuf(size_t nLen)
-{
- if ( !AllocBeforeWrite(nLen) ) {
- // allocation failure handled by caller
- return nullptr;
- }
-
- wxASSERT( GetStringData()->nRefs == 1 );
- GetStringData()->Validate(false);
-
- return m_pchData;
-}
-
-// put string back in a reasonable state after GetWriteBuf
-void wxStringImpl::DoUngetWriteBuf()
-{
- DoUngetWriteBuf(wxStrlen(m_pchData));
-}
-
-void wxStringImpl::DoUngetWriteBuf(size_t nLen)
-{
- wxStringData * const pData = GetStringData();
-
- wxASSERT_MSG( nLen < pData->nAllocLength, wxT("buffer overrun") );
-
- // the strings we store are always NUL-terminated
- pData->data()[nLen] = wxT('\0');
- pData->nDataLength = nLen;
- pData->Validate(true);
-}
-
-#endif // !wxUSE_STL_BASED_WXSTRING
diff --git a/src/common/stringops.cpp b/src/common/stringops.cpp
index 04953eea55..871c576dd1 100644
--- a/src/common/stringops.cpp
+++ b/src/common/stringops.cpp
@@ -128,7 +128,7 @@ bool wxStringOperationsUtf8::IsValidUtf8String(const char *str, size_t len)
return true; // empty string is UTF8 string
const unsigned char *c = (const unsigned char*)str;
- const unsigned char * const end = (len == wxStringImpl::npos) ? nullptr : c + len;
+ const unsigned char * const end = (len == std::string::npos) ? nullptr : c + len;
for ( ; end != nullptr ? c != end : *c; ++c )
{
@@ -285,7 +285,7 @@ wxUniChar::Utf8CharBuffer wxUniChar::AsUTF8() const
}
wxUniChar
-wxStringOperationsUtf8::DecodeNonAsciiChar(wxStringImpl::const_iterator i)
+wxStringOperationsUtf8::DecodeNonAsciiChar(std::string::const_iterator i)
{
wxASSERT( IsValidUtf8LeadByte(*i) );
diff --git a/tests/allheaders.h b/tests/allheaders.h
index 5413613471..5829607506 100644
--- a/tests/allheaders.h
+++ b/tests/allheaders.h
@@ -325,7 +325,6 @@
#include
#include
#include
-#include
#include
#include
#include