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

Side by Side Diff: core/include/fxcrt/fx_string.h

Issue 1142533002: Make CFX_StringData be scoped by CFX_Bytestring and add methods. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 5 years, 7 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 | « no previous file | core/src/fxcrt/fx_basic_bstring.cpp » ('j') | core/src/fxcrt/fx_basic_bstring.cpp » ('J')
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 #ifndef _FX_STRING_H_ 7 #ifndef _FX_STRING_H_
8 #define _FX_STRING_H_ 8 #define _FX_STRING_H_
9 9
10 #include <stdint.h> // For intptr_t. 10 #include <stdint.h> // For intptr_t.
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 inline bool operator== (const char* lhs, const CFX_ByteStringC& rhs) { 164 inline bool operator== (const char* lhs, const CFX_ByteStringC& rhs) {
165 return rhs == lhs; 165 return rhs == lhs;
166 } 166 }
167 inline bool operator!= (const char* lhs, const CFX_ByteStringC& rhs) { 167 inline bool operator!= (const char* lhs, const CFX_ByteStringC& rhs) {
168 return rhs != lhs; 168 return rhs != lhs;
169 } 169 }
170 typedef const CFX_ByteStringC& FX_BSTR; 170 typedef const CFX_ByteStringC& FX_BSTR;
171 #define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1) 171 #define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1)
172 #define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4)) 172 #define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4))
173 173
174 // To ensure ref counts do not overflow, consider the worst possible case:
175 // the entire address space contains nothing but pointers to this object.
176 // Since the count increments with each new pointer, the largest value is
177 // the number of pointers that can fit into the address space. The size of
178 // the address space itself is a good upper bound on it; we need not go
179 // larger.
180 struct CFX_StringData {
181 intptr_t m_nRefs; // Would prefer ssize_t, but no windows support.
182 FX_STRSIZE m_nDataLength;
183 FX_STRSIZE m_nAllocLength;
184 FX_CHAR m_String[1];
185 };
186
187 // A mutable string with shared buffers using copy-on-write semantics that 174 // A mutable string with shared buffers using copy-on-write semantics that
188 // avoids the cost of std::string's iterator stability guarantees. 175 // avoids the cost of std::string's iterator stability guarantees.
189 class CFX_ByteString 176 class CFX_ByteString
190 { 177 {
191 public: 178 public:
192 typedef FX_CHAR value_type; 179 typedef FX_CHAR value_type;
193 180
194 CFX_ByteString() 181 CFX_ByteString()
195 { 182 {
196 m_pData = NULL; 183 m_pData = NULL;
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 343
357 void ConvertFrom(const CFX_WideString & str, CFX_CharMap* pCharMap = NULL); 344 void ConvertFrom(const CFX_WideString & str, CFX_CharMap* pCharMap = NULL);
358 345
359 FX_DWORD GetID(FX_STRSIZE start_pos = 0) const; 346 FX_DWORD GetID(FX_STRSIZE start_pos = 0) const;
360 347
361 #define FXFORMAT_SIGNED 1 348 #define FXFORMAT_SIGNED 1
362 #define FXFORMAT_HEX 2 349 #define FXFORMAT_HEX 2
363 #define FXFORMAT_CAPITAL 4 350 #define FXFORMAT_CAPITAL 4
364 351
365 static CFX_ByteString FormatInteger(int i, FX_DWORD flags = 0); 352 static CFX_ByteString FormatInteger(int i, FX_DWORD flags = 0);
353 static CFX_ByteString FormatFloat(FX_FLOAT f, int precision = 0);
366 354
367 static CFX_ByteString FormatFloat(FX_FLOAT f, int precision = 0);
368 protected: 355 protected:
356 // To ensure ref counts do not overflow, consider the worst possible case:
357 // the entire address space contains nothing but pointers to this object.
358 // Since the count increments with each new pointer, the largest value is
359 // the number of pointers that can fit into the address space. The size of
360 // the address space itself is a good upper bound on it; we need not go
361 // larger.
362 struct StringData {
363 static StringData* Create(int nLen);
364 void Retain() { ++m_nRefs; }
Lei Zhang 2015/05/14 19:28:39 Once a struct starts having methods, it should pro
Tom Sepez 2015/05/14 19:54:43 Done.
365 void Release() { if (--m_nRefs <= 0) FX_Free(this); }
369 366
370 struct CFX_StringData*» m_pData; 367 intptr_t» m_nRefs; // Would prefer ssize_t, but no windows suppor t.
Lei Zhang 2015/05/14 19:28:39 kill tabs
Tom Sepez 2015/05/14 19:54:43 Done.
368 FX_STRSIZE» m_nDataLength;
369 FX_STRSIZE» m_nAllocLength;
370 FX_CHAR»» m_String[1];
371
372 private:
373 StringData(FX_STRSIZE dataLen, FX_STRSIZE allocLen)
374 : m_nRefs(1), m_nDataLength(dataLen), m_nAllocLength(allocLe n) {
Lei Zhang 2015/05/14 19:28:39 nit: too many spaces here?
Lei Zhang 2015/05/14 20:50:14 Shouldn't it be 4 spaces from the start of "String
Tom Sepez 2015/05/14 21:25:06 Should be a double-indent from the start of "Strin
375 m_String[dataLen] = 0;
Lei Zhang 2015/05/14 19:28:39 I hate the fact that FX_STRSIZE is signed. Should
Tom Sepez 2015/05/14 19:54:43 Yes.
376 }
377 };
378
371 void AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const; 379 void AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const;
372 void AssignCopy(FX_STRSIZE nSrcLen, F X_LPCSTR lpszSrcData); 380 void AssignCopy(FX_STRSIZE nSrcLen, F X_LPCSTR lpszSrcData);
373 void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data); 381 void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data);
374 void ConcatInPlace(FX_STRSIZE nSrcLen , FX_LPCSTR lpszSrcData); 382 void ConcatInPlace(FX_STRSIZE nSrcLen , FX_LPCSTR lpszSrcData);
375 void CopyBeforeWrite(); 383 void CopyBeforeWrite();
376 void AllocBeforeWrite(FX_STRSIZE nLen ); 384 void AllocBeforeWrite(FX_STRSIZE nLen );
385
386 StringData* m_pData;
377 }; 387 };
378 inline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src) 388 inline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src)
379 { 389 {
380 m_Ptr = (FX_LPCBYTE)src; 390 m_Ptr = (FX_LPCBYTE)src;
381 m_Length = src.GetLength(); 391 m_Length = src.GetLength();
382 } 392 }
383 inline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src) 393 inline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src)
384 { 394 {
385 m_Ptr = (FX_LPCBYTE)src; 395 m_Ptr = (FX_LPCBYTE)src;
386 m_Length = src.GetLength(); 396 m_Length = src.GetLength();
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 }; 603 };
594 inline bool operator== (const wchar_t* lhs, const CFX_WideStringC& rhs) { 604 inline bool operator== (const wchar_t* lhs, const CFX_WideStringC& rhs) {
595 return rhs == lhs; 605 return rhs == lhs;
596 } 606 }
597 inline bool operator!= (const wchar_t* lhs, const CFX_WideStringC& rhs) { 607 inline bool operator!= (const wchar_t* lhs, const CFX_WideStringC& rhs) {
598 return rhs != lhs; 608 return rhs != lhs;
599 } 609 }
600 typedef const CFX_WideStringC& FX_WSTR; 610 typedef const CFX_WideStringC& FX_WSTR;
601 #define FX_WSTRC(wstr) CFX_WideStringC(wstr, FX_ArraySize(wstr) - 1) 611 #define FX_WSTRC(wstr) CFX_WideStringC(wstr, FX_ArraySize(wstr) - 1)
602 612
603 struct CFX_StringDataW {
604 intptr_t m_nRefs; // Would prefer ssize_t, but no windows support.
605 FX_STRSIZE m_nDataLength;
606 FX_STRSIZE m_nAllocLength;
607 FX_WCHAR m_String[1];
608 };
609
610 // A mutable string with shared buffers using copy-on-write semantics that 613 // A mutable string with shared buffers using copy-on-write semantics that
611 // avoids the cost of std::string's iterator stability guarantees. 614 // avoids the cost of std::string's iterator stability guarantees.
612 class CFX_WideString 615 class CFX_WideString
613 { 616 {
614 public: 617 public:
615 typedef FX_WCHAR value_type; 618 typedef FX_WCHAR value_type;
616 619
617 CFX_WideString() 620 CFX_WideString()
618 { 621 {
619 m_pData = NULL; 622 m_pData = NULL;
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 773
771 FX_STRSIZE Remove(FX_WCHAR ch); 774 FX_STRSIZE Remove(FX_WCHAR ch);
772 775
773 CFX_ByteString UTF8Encode() const; 776 CFX_ByteString UTF8Encode() const;
774 777
775 CFX_ByteString UTF16LE_Encode() const; 778 CFX_ByteString UTF16LE_Encode() const;
776 779
777 void ConvertFrom(const CFX_ByteString & str, CFX_CharMap* pCharMap = NULL); 780 void ConvertFrom(const CFX_ByteString & str, CFX_CharMap* pCharMap = NULL);
778 781
779 protected: 782 protected:
783 class StringData {
Lei Zhang 2015/05/14 19:28:39 Hey, this one is a class! :-P
Tom Sepez 2015/05/14 19:54:43 So much for consistency.
784 public:
785 static StringData* Create(int nLen);
786 void Retain() { ++m_nRefs; }
787 void Release() { if (--m_nRefs <= 0) FX_Free(this); }
788
789 intptr_t m_nRefs; // Would prefer ssize_t, but no windows suppor t.
790 FX_STRSIZE m_nDataLength;
791 FX_STRSIZE m_nAllocLength;
792 FX_WCHAR m_String[1];
793
794 private:
795 StringData(FX_STRSIZE dataLen, FX_STRSIZE allocLen)
796 : m_nRefs(1), m_nDataLength(dataLen), m_nAllocLength(allocLe n) {
797 m_String[dataLen] = 0;
798 }
799 };
800
Tom Sepez 2015/05/14 19:54:43 Dawns on me that this should have a ~StringData()
780 void CopyBeforeWrite(); 801 void CopyBeforeWrite();
781 void AllocBeforeWrite(FX_STRSIZE nLen ); 802 void AllocBeforeWrite(FX_STRSIZE nLen );
782 void ConcatInPlace(FX_STRSIZE nSrcLen , FX_LPCWSTR lpszSrcData); 803 void ConcatInPlace(FX_STRSIZE nSrcLen , FX_LPCWSTR lpszSrcData);
783 void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data); 804 void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data);
784 void AssignCopy(FX_STRSIZE nSrcLen, F X_LPCWSTR lpszSrcData); 805 void AssignCopy(FX_STRSIZE nSrcLen, F X_LPCWSTR lpszSrcData);
785 void AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const; 806 void AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const;
786 807
787 CFX_StringDataW*» » m_pData; 808 StringData*»m_pData;
788 }; 809 };
789 inline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src) 810 inline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src)
790 { 811 {
791 m_Ptr = src.c_str(); 812 m_Ptr = src.c_str();
792 m_Length = src.GetLength(); 813 m_Length = src.GetLength();
793 } 814 }
794 inline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src) 815 inline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src)
795 { 816 {
796 m_Ptr = src.c_str(); 817 m_Ptr = src.c_str();
797 m_Length = src.GetLength(); 818 m_Length = src.GetLength();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len); 885 CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len);
865 inline CFX_ByteString FX_UTF8Encode(FX_WSTR wsStr) 886 inline CFX_ByteString FX_UTF8Encode(FX_WSTR wsStr)
866 { 887 {
867 return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength()); 888 return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength());
868 } 889 }
869 inline CFX_ByteString FX_UTF8Encode(const CFX_WideString &wsStr) 890 inline CFX_ByteString FX_UTF8Encode(const CFX_WideString &wsStr)
870 { 891 {
871 return FX_UTF8Encode(wsStr.c_str(), wsStr.GetLength()); 892 return FX_UTF8Encode(wsStr.c_str(), wsStr.GetLength());
872 } 893 }
873 #endif 894 #endif
OLDNEW
« no previous file with comments | « no previous file | core/src/fxcrt/fx_basic_bstring.cpp » ('j') | core/src/fxcrt/fx_basic_bstring.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698