OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights
reserved. | 3 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights
reserved. |
4 * Copyright (C) 2009 Google Inc. All rights reserved. | 4 * Copyright (C) 2009 Google Inc. All rights reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 , m_refCount(s_refCountIncrement) | 151 , m_refCount(s_refCountIncrement) |
152 , m_length(length) | 152 , m_length(length) |
153 , m_hashAndFlags(0) | 153 , m_hashAndFlags(0) |
154 { | 154 { |
155 ASSERT(m_data16); | 155 ASSERT(m_data16); |
156 ASSERT(m_length); | 156 ASSERT(m_length); |
157 | 157 |
158 STRING_STATS_ADD_16BIT_STRING(m_length); | 158 STRING_STATS_ADD_16BIT_STRING(m_length); |
159 } | 159 } |
160 | 160 |
161 enum ConstructFromLiteralTag { ConstructFromLiteral }; | |
162 StringImpl(const char* characters, unsigned length, ConstructFromLiteralTag) | |
163 : m_data8(reinterpret_cast<const LChar*>(characters)) | |
164 , m_refCount(s_refCountIncrement) | |
165 , m_length(length) | |
166 , m_hashAndFlags(s_hashFlag8BitBuffer) | |
167 { | |
168 ASSERT(m_data8); | |
169 ASSERT(m_length); | |
170 ASSERT(!characters[length]); | |
171 | |
172 STRING_STATS_ADD_8BIT_STRING(0); | |
173 } | |
174 | |
175 public: | 161 public: |
176 ~StringImpl(); | 162 ~StringImpl(); |
177 | 163 |
178 static PassRefPtr<StringImpl> create(const UChar*, unsigned length); | 164 static PassRefPtr<StringImpl> create(const UChar*, unsigned length); |
179 static PassRefPtr<StringImpl> create(const LChar*, unsigned length); | 165 static PassRefPtr<StringImpl> create(const LChar*, unsigned length); |
180 static PassRefPtr<StringImpl> create8BitIfPossible(const UChar*, unsigned le
ngth); | 166 static PassRefPtr<StringImpl> create8BitIfPossible(const UChar*, unsigned le
ngth); |
181 template<size_t inlineCapacity> | 167 template<size_t inlineCapacity> |
182 static PassRefPtr<StringImpl> create8BitIfPossible(const Vector<UChar, inlin
eCapacity>& vector) | 168 static PassRefPtr<StringImpl> create8BitIfPossible(const Vector<UChar, inlin
eCapacity>& vector) |
183 { | 169 { |
184 return create8BitIfPossible(vector.data(), vector.size()); | 170 return create8BitIfPossible(vector.data(), vector.size()); |
185 } | 171 } |
186 | 172 |
187 ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s, unsigned l
ength) { return create(reinterpret_cast<const LChar*>(s), length); } | 173 ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s, unsigned l
ength) { return create(reinterpret_cast<const LChar*>(s), length); } |
188 static PassRefPtr<StringImpl> create(const LChar*); | 174 static PassRefPtr<StringImpl> create(const LChar*); |
189 ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s) { return c
reate(reinterpret_cast<const LChar*>(s)); } | 175 ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s) { return c
reate(reinterpret_cast<const LChar*>(s)); } |
190 | 176 |
191 static PassRefPtr<StringImpl> createFromLiteral(const char* characters, unsi
gned length); | |
192 template<unsigned charactersCount> | |
193 ALWAYS_INLINE static PassRefPtr<StringImpl> createFromLiteral(const char (&c
haracters)[charactersCount]) | |
194 { | |
195 COMPILE_ASSERT(charactersCount > 1, StringImplFromLiteralNotEmpty); | |
196 COMPILE_ASSERT((charactersCount - 1 <= ((unsigned(~0) - sizeof(StringImp
l)) / sizeof(LChar))), StringImplFromLiteralCannotOverflow); | |
197 | |
198 return createFromLiteral(characters, charactersCount - 1); | |
199 } | |
200 static PassRefPtr<StringImpl> createFromLiteral(const char* characters); | |
201 | |
202 static PassRefPtr<StringImpl> createUninitialized(unsigned length, LChar*& d
ata); | 177 static PassRefPtr<StringImpl> createUninitialized(unsigned length, LChar*& d
ata); |
203 static PassRefPtr<StringImpl> createUninitialized(unsigned length, UChar*& d
ata); | 178 static PassRefPtr<StringImpl> createUninitialized(unsigned length, UChar*& d
ata); |
204 template <typename T> static ALWAYS_INLINE PassRefPtr<StringImpl> tryCreateU
ninitialized(unsigned length, T*& output) | 179 template <typename T> static ALWAYS_INLINE PassRefPtr<StringImpl> tryCreateU
ninitialized(unsigned length, T*& output) |
205 { | 180 { |
206 if (!length) { | 181 if (!length) { |
207 output = 0; | 182 output = 0; |
208 return empty(); | 183 return empty(); |
209 } | 184 } |
210 | 185 |
211 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)
) / sizeof(T))) { | 186 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)
) / sizeof(T))) { |
(...skipping 16 matching lines...) Expand all Loading... |
228 // Reallocate the StringImpl. The originalString must be only owned by the P
assRefPtr. | 203 // Reallocate the StringImpl. The originalString must be only owned by the P
assRefPtr. |
229 // Just like the input pointer of realloc(), the originalString can't be use
d after this function. | 204 // Just like the input pointer of realloc(), the originalString can't be use
d after this function. |
230 static PassRefPtr<StringImpl> reallocate(PassRefPtr<StringImpl> originalStri
ng, unsigned length, LChar*& data); | 205 static PassRefPtr<StringImpl> reallocate(PassRefPtr<StringImpl> originalStri
ng, unsigned length, LChar*& data); |
231 static PassRefPtr<StringImpl> reallocate(PassRefPtr<StringImpl> originalStri
ng, unsigned length, UChar*& data); | 206 static PassRefPtr<StringImpl> reallocate(PassRefPtr<StringImpl> originalStri
ng, unsigned length, UChar*& data); |
232 | 207 |
233 // If this StringImpl has only one reference, we can truncate the string by
updating | 208 // If this StringImpl has only one reference, we can truncate the string by
updating |
234 // its m_length property without actually re-allocating its buffer. | 209 // its m_length property without actually re-allocating its buffer. |
235 void truncateAssumingIsolated(unsigned length) | 210 void truncateAssumingIsolated(unsigned length) |
236 { | 211 { |
237 ASSERT(hasOneRef()); | 212 ASSERT(hasOneRef()); |
238 ASSERT(!isASCIILiteral()); | |
239 ASSERT(length <= m_length); | 213 ASSERT(length <= m_length); |
240 m_length = length; | 214 m_length = length; |
241 } | 215 } |
242 | 216 |
243 unsigned length() const { return m_length; } | 217 unsigned length() const { return m_length; } |
244 bool is8Bit() const { return m_hashAndFlags & s_hashFlag8BitBuffer; } | 218 bool is8Bit() const { return m_hashAndFlags & s_hashFlag8BitBuffer; } |
245 | 219 |
246 ALWAYS_INLINE const LChar* characters8() const { ASSERT(is8Bit()); return m_
data8; } | 220 ALWAYS_INLINE const LChar* characters8() const { ASSERT(is8Bit()); return m_
data8; } |
247 ALWAYS_INLINE const UChar* characters16() const { ASSERT(!is8Bit()); return
m_data16; } | 221 ALWAYS_INLINE const UChar* characters16() const { ASSERT(!is8Bit()); return
m_data16; } |
248 | 222 |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 #endif | 434 #endif |
461 #ifdef __OBJC__ | 435 #ifdef __OBJC__ |
462 operator NSString*(); | 436 operator NSString*(); |
463 #endif | 437 #endif |
464 | 438 |
465 #ifdef STRING_STATS | 439 #ifdef STRING_STATS |
466 ALWAYS_INLINE static StringStats& stringStats() { return m_stringStats; } | 440 ALWAYS_INLINE static StringStats& stringStats() { return m_stringStats; } |
467 #endif | 441 #endif |
468 | 442 |
469 private: | 443 private: |
470 bool isASCIILiteral() const | |
471 { | |
472 return is8Bit() && length() && reinterpret_cast<const void*>(m_data8) !=
reinterpret_cast<const void*>(this + 1); | |
473 } | |
474 | |
475 // This number must be at least 2 to avoid sharing empty, null as well as 1
character strings from SmallStrings. | 444 // This number must be at least 2 to avoid sharing empty, null as well as 1
character strings from SmallStrings. |
476 static const unsigned s_copyCharsInlineCutOff = 20; | 445 static const unsigned s_copyCharsInlineCutOff = 20; |
477 | 446 |
478 template <class UCharPredicate> PassRefPtr<StringImpl> stripMatchedCharacter
s(UCharPredicate); | 447 template <class UCharPredicate> PassRefPtr<StringImpl> stripMatchedCharacter
s(UCharPredicate); |
479 template <typename CharType, class UCharPredicate> PassRefPtr<StringImpl> si
mplifyMatchedCharactersToSpace(UCharPredicate); | 448 template <typename CharType, class UCharPredicate> PassRefPtr<StringImpl> si
mplifyMatchedCharactersToSpace(UCharPredicate); |
480 NEVER_INLINE unsigned hashSlowCase() const; | 449 NEVER_INLINE unsigned hashSlowCase() const; |
481 | 450 |
482 // The bottom bit in the ref count indicates a static (immortal) string. | 451 // The bottom bit in the ref count indicates a static (immortal) string. |
483 static const unsigned s_refCountFlagIsStaticString = 0x1; | 452 static const unsigned s_refCountFlagIsStaticString = 0x1; |
484 static const unsigned s_refCountIncrement = 0x2; // This allows us to ref /
deref without disturbing the static string flag. | 453 static const unsigned s_refCountIncrement = 0x2; // This allows us to ref /
deref without disturbing the static string flag. |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 | 759 |
791 static inline bool isSpaceOrNewline(UChar c) | 760 static inline bool isSpaceOrNewline(UChar c) |
792 { | 761 { |
793 // Use isASCIISpace() for basic Latin-1. | 762 // Use isASCIISpace() for basic Latin-1. |
794 // This will include newlines, which aren't included in Unicode DirWS. | 763 // This will include newlines, which aren't included in Unicode DirWS. |
795 return c <= 0x7F ? WTF::isASCIISpace(c) : WTF::Unicode::direction(c) == WTF:
:Unicode::WhiteSpaceNeutral; | 764 return c <= 0x7F ? WTF::isASCIISpace(c) : WTF::Unicode::direction(c) == WTF:
:Unicode::WhiteSpaceNeutral; |
796 } | 765 } |
797 | 766 |
798 inline PassRefPtr<StringImpl> StringImpl::isolatedCopy() const | 767 inline PassRefPtr<StringImpl> StringImpl::isolatedCopy() const |
799 { | 768 { |
800 if (isASCIILiteral()) | |
801 return StringImpl::createFromLiteral(reinterpret_cast<const char*>(m_dat
a8), m_length); | |
802 if (is8Bit()) | 769 if (is8Bit()) |
803 return create(m_data8, m_length); | 770 return create(m_data8, m_length); |
804 return create(m_data16, m_length); | 771 return create(m_data16, m_length); |
805 } | 772 } |
806 | 773 |
807 struct StringHash; | 774 struct StringHash; |
808 | 775 |
809 // StringHash is the default hash for StringImpl* and RefPtr<StringImpl> | 776 // StringHash is the default hash for StringImpl* and RefPtr<StringImpl> |
810 template<typename T> struct DefaultHash; | 777 template<typename T> struct DefaultHash; |
811 template<> struct DefaultHash<StringImpl*> { | 778 template<> struct DefaultHash<StringImpl*> { |
812 typedef StringHash Hash; | 779 typedef StringHash Hash; |
813 }; | 780 }; |
814 template<> struct DefaultHash<RefPtr<StringImpl> > { | 781 template<> struct DefaultHash<RefPtr<StringImpl> > { |
815 typedef StringHash Hash; | 782 typedef StringHash Hash; |
816 }; | 783 }; |
817 | 784 |
818 } | 785 } |
819 | 786 |
820 using WTF::StringImpl; | 787 using WTF::StringImpl; |
821 using WTF::equal; | 788 using WTF::equal; |
822 using WTF::equalNonNull; | 789 using WTF::equalNonNull; |
823 using WTF::TextCaseSensitivity; | 790 using WTF::TextCaseSensitivity; |
824 using WTF::TextCaseSensitive; | 791 using WTF::TextCaseSensitive; |
825 using WTF::TextCaseInsensitive; | 792 using WTF::TextCaseInsensitive; |
826 | 793 |
827 #endif | 794 #endif |
OLD | NEW |