Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: core/fxcrt/fx_basic_wstring.cpp

Issue 1877553002: Avoid copying in TrimRight() and TrimLeft() if possible. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: More accurate comment in fx_string.h Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fxcrt/fx_basic_bstring_unittest.cpp ('k') | core/fxcrt/fx_basic_wstring_unittest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cctype> 10 #include <cctype>
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 if (str) 833 if (str)
834 while (str[len]) 834 while (str[len])
835 len++; 835 len++;
836 return len; 836 return len;
837 } 837 }
838 838
839 void CFX_WideString::TrimRight(const CFX_WideStringC& pTargets) { 839 void CFX_WideString::TrimRight(const CFX_WideStringC& pTargets) {
840 if (!m_pData || pTargets.IsEmpty()) { 840 if (!m_pData || pTargets.IsEmpty()) {
841 return; 841 return;
842 } 842 }
843 ReallocBeforeWrite(m_pData->m_nDataLength);
844 FX_STRSIZE pos = GetLength(); 843 FX_STRSIZE pos = GetLength();
845 if (pos < 1) { 844 if (pos < 1) {
846 return; 845 return;
847 } 846 }
848 while (pos) { 847 while (pos) {
849 if (!FXSYS_wcschr(pTargets.c_str(), m_pData->m_String[pos - 1])) { 848 if (!FXSYS_wcschr(pTargets.c_str(), m_pData->m_String[pos - 1])) {
850 break; 849 break;
851 } 850 }
852 pos--; 851 pos--;
853 } 852 }
854 if (pos < m_pData->m_nDataLength) { 853 if (pos < m_pData->m_nDataLength) {
854 ReallocBeforeWrite(m_pData->m_nDataLength);
855 m_pData->m_String[pos] = 0; 855 m_pData->m_String[pos] = 0;
856 m_pData->m_nDataLength = pos; 856 m_pData->m_nDataLength = pos;
857 } 857 }
858 } 858 }
859 859
860 void CFX_WideString::TrimRight(FX_WCHAR chTarget) { 860 void CFX_WideString::TrimRight(FX_WCHAR chTarget) {
861 FX_WCHAR str[2] = {chTarget, 0}; 861 FX_WCHAR str[2] = {chTarget, 0};
862 TrimRight(str); 862 TrimRight(str);
863 } 863 }
864 864
865 void CFX_WideString::TrimRight() { 865 void CFX_WideString::TrimRight() {
866 TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20"); 866 TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20");
867 } 867 }
868 868
869 void CFX_WideString::TrimLeft(const CFX_WideStringC& pTargets) { 869 void CFX_WideString::TrimLeft(const CFX_WideStringC& pTargets) {
870 if (!m_pData || pTargets.IsEmpty()) 870 if (!m_pData || pTargets.IsEmpty())
871 return; 871 return;
872 872
873 FX_STRSIZE len = GetLength(); 873 FX_STRSIZE len = GetLength();
874 if (len < 1) 874 if (len < 1)
875 return; 875 return;
876 876
877 ReallocBeforeWrite(len); 877 FX_STRSIZE pos = 0;
878 const FX_WCHAR* lpsz = m_pData->m_String; 878 while (pos < len) {
879 while (*lpsz != 0) { 879 FX_STRSIZE i = 0;
880 if (!FXSYS_wcschr(pTargets.c_str(), *lpsz)) { 880 while (i < pTargets.GetLength() && pTargets[i] != m_pData->m_String[pos]) {
881 i++;
882 }
883 if (i == pTargets.GetLength()) {
881 break; 884 break;
882 } 885 }
883 lpsz++; 886 pos++;
884 } 887 }
885 if (lpsz != m_pData->m_String) { 888 if (pos) {
886 int nDataLength = 889 ReallocBeforeWrite(len);
887 m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->m_String); 890 FX_STRSIZE nDataLength = len - pos;
888 FXSYS_memmove(m_pData->m_String, lpsz, 891 FXSYS_memmove(m_pData->m_String, m_pData->m_String + pos,
889 (nDataLength + 1) * sizeof(FX_WCHAR)); 892 (nDataLength + 1) * sizeof(FX_WCHAR));
890 m_pData->m_nDataLength = nDataLength; 893 m_pData->m_nDataLength = nDataLength;
891 } 894 }
892 } 895 }
893 896
894 void CFX_WideString::TrimLeft(FX_WCHAR chTarget) { 897 void CFX_WideString::TrimLeft(FX_WCHAR chTarget) {
895 FX_WCHAR str[2] = {chTarget, 0}; 898 FX_WCHAR str[2] = {chTarget, 0};
896 TrimLeft(str); 899 TrimLeft(str);
897 } 900 }
898 901
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, nullptr, 0); 970 FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, nullptr, 0);
968 CFX_WideString wstr; 971 CFX_WideString wstr;
969 if (dest_len) { 972 if (dest_len) {
970 FX_WCHAR* dest_buf = wstr.GetBuffer(dest_len); 973 FX_WCHAR* dest_buf = wstr.GetBuffer(dest_len);
971 FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, dest_buf, 974 FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, dest_buf,
972 dest_len); 975 dest_len);
973 wstr.ReleaseBuffer(dest_len); 976 wstr.ReleaseBuffer(dest_len);
974 } 977 }
975 return wstr; 978 return wstr;
976 } 979 }
OLDNEW
« no previous file with comments | « core/fxcrt/fx_basic_bstring_unittest.cpp ('k') | core/fxcrt/fx_basic_wstring_unittest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698