373436055a5aa19a22b3f3532ee8f1e73dda5268
[WebKit-https.git] / Source / WTF / wtf / text / StringImpl.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
4  * Copyright (C) 2009 Google Inc. All rights reserved.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  *
21  */
22
23 #ifndef StringImpl_h
24 #define StringImpl_h
25
26 #include <limits.h>
27 #include <wtf/ASCIICType.h>
28 #include <wtf/Forward.h>
29 #include <wtf/StdLibExtras.h>
30 #include <wtf/StringHasher.h>
31 #include <wtf/Vector.h>
32 #include <wtf/unicode/Unicode.h>
33
34 #if USE(CF)
35 typedef const struct __CFString * CFStringRef;
36 #endif
37
38 #ifdef __OBJC__
39 @class NSString;
40 #endif
41
42 // FIXME: This is a temporary layering violation while we move string code to WTF.
43 // Landing the file moves in one patch, will follow on with patches to change the namespaces.
44 namespace JSC {
45 struct IdentifierCStringTranslator;
46 namespace LLInt { class Data; }
47 class LLIntOffsetsExtractor;
48 template <typename T> struct IdentifierCharBufferTranslator;
49 struct IdentifierLCharFromUCharTranslator;
50 }
51
52 namespace WTF {
53
54 struct CStringTranslator;
55 struct HashAndCharactersTranslator;
56 struct HashAndUTF8CharactersTranslator;
57 struct SubstringTranslator;
58 struct UCharBufferTranslator;
59
60 enum TextCaseSensitivity { TextCaseSensitive, TextCaseInsensitive };
61
62 typedef bool (*CharacterMatchFunctionPtr)(UChar);
63 typedef bool (*IsWhiteSpaceFunctionPtr)(UChar);
64
65 class StringImpl {
66     WTF_MAKE_NONCOPYABLE(StringImpl); WTF_MAKE_FAST_ALLOCATED;
67     friend struct JSC::IdentifierCStringTranslator;
68     friend struct JSC::IdentifierCharBufferTranslator<LChar>;
69     friend struct JSC::IdentifierCharBufferTranslator<UChar>;
70     friend struct JSC::IdentifierLCharFromUCharTranslator;
71     friend struct WTF::CStringTranslator;
72     friend struct WTF::HashAndCharactersTranslator;
73     friend struct WTF::HashAndUTF8CharactersTranslator;
74     friend struct WTF::SubstringTranslator;
75     friend struct WTF::UCharBufferTranslator;
76     friend class AtomicStringImpl;
77     friend class JSC::LLInt::Data;
78     friend class JSC::LLIntOffsetsExtractor;
79     
80 private:
81     enum BufferOwnership {
82         BufferInternal,
83         BufferOwned,
84         BufferSubstring,
85     };
86
87     // Used to construct static strings, which have an special refCount that can never hit zero.
88     // This means that the static string will never be destroyed, which is important because
89     // static strings will be shared across threads & ref-counted in a non-threadsafe manner.
90     enum ConstructStaticStringTag { ConstructStaticString };
91     StringImpl(const UChar* characters, unsigned length, ConstructStaticStringTag)
92         : m_refCount(s_refCountFlagIsStaticString)
93         , m_length(length)
94         , m_data16(characters)
95         , m_buffer(0)
96         , m_hashAndFlags(s_hashFlagIsIdentifier | BufferOwned)
97     {
98         // Ensure that the hash is computed so that AtomicStringHash can call existingHash()
99         // with impunity. The empty string is special because it is never entered into
100         // AtomicString's HashKey, but still needs to compare correctly.
101         hash();
102     }
103
104     // Used to construct static strings, which have an special refCount that can never hit zero.
105     // This means that the static string will never be destroyed, which is important because
106     // static strings will be shared across threads & ref-counted in a non-threadsafe manner.
107     StringImpl(const LChar* characters, unsigned length, ConstructStaticStringTag)
108         : m_refCount(s_refCountFlagIsStaticString)
109         , m_length(length)
110         , m_data8(characters)
111         , m_buffer(0)
112         , m_hashAndFlags(s_hashFlag8BitBuffer | s_hashFlagIsIdentifier | BufferOwned)
113     {
114         // Ensure that the hash is computed so that AtomicStringHash can call existingHash()
115         // with impunity. The empty string is special because it is never entered into
116         // AtomicString's HashKey, but still needs to compare correctly.
117         hash();
118     }
119
120     // FIXME: there has to be a less hacky way to do this.
121     enum Force8Bit { Force8BitConstructor };
122     // Create a normal 8-bit string with internal storage (BufferInternal)
123     StringImpl(unsigned length, Force8Bit)
124         : m_refCount(s_refCountIncrement)
125         , m_length(length)
126         , m_data8(reinterpret_cast<const LChar*>(this + 1))
127         , m_buffer(0)
128         , m_hashAndFlags(s_hashFlag8BitBuffer | BufferInternal)
129     {
130         ASSERT(m_data8);
131         ASSERT(m_length);
132     }
133
134     // Create a normal 16-bit string with internal storage (BufferInternal)
135     StringImpl(unsigned length)
136         : m_refCount(s_refCountIncrement)
137         , m_length(length)
138         , m_data16(reinterpret_cast<const UChar*>(this + 1))
139         , m_buffer(0)
140         , m_hashAndFlags(BufferInternal)
141     {
142         ASSERT(m_data16);
143         ASSERT(m_length);
144     }
145
146     // Create a StringImpl adopting ownership of the provided buffer (BufferOwned)
147     StringImpl(const LChar* characters, unsigned length)
148         : m_refCount(s_refCountIncrement)
149         , m_length(length)
150         , m_data8(characters)
151         , m_buffer(0)
152         , m_hashAndFlags(s_hashFlag8BitBuffer | BufferOwned)
153     {
154         ASSERT(m_data8);
155         ASSERT(m_length);
156     }
157
158     // Create a StringImpl adopting ownership of the provided buffer (BufferOwned)
159     StringImpl(const UChar* characters, unsigned length)
160     : m_refCount(s_refCountIncrement)
161     , m_length(length)
162     , m_data16(characters)
163     , m_buffer(0)
164     , m_hashAndFlags(BufferOwned)
165     {
166         ASSERT(m_data16);
167         ASSERT(m_length);
168     }
169
170     // Used to create new strings that are a substring of an existing 8-bit StringImpl (BufferSubstring)
171     StringImpl(const LChar* characters, unsigned length, PassRefPtr<StringImpl> base)
172         : m_refCount(s_refCountIncrement)
173         , m_length(length)
174         , m_data8(characters)
175         , m_substringBuffer(base.leakRef())
176         , m_hashAndFlags(s_hashFlag8BitBuffer | BufferSubstring)
177     {
178         ASSERT(is8Bit());
179         ASSERT(m_data8);
180         ASSERT(m_length);
181         ASSERT(m_substringBuffer->bufferOwnership() != BufferSubstring);
182     }
183
184     // Used to create new strings that are a substring of an existing 16-bit StringImpl (BufferSubstring)
185     StringImpl(const UChar* characters, unsigned length, PassRefPtr<StringImpl> base)
186         : m_refCount(s_refCountIncrement)
187         , m_length(length)
188         , m_data16(characters)
189         , m_substringBuffer(base.leakRef())
190         , m_hashAndFlags(BufferSubstring)
191     {
192         ASSERT(!is8Bit());
193         ASSERT(m_data16);
194         ASSERT(m_length);
195         ASSERT(m_substringBuffer->bufferOwnership() != BufferSubstring);
196     }
197
198 public:
199     WTF_EXPORT_PRIVATE ~StringImpl();
200
201     WTF_EXPORT_PRIVATE static PassRefPtr<StringImpl> create(const UChar*, unsigned length);
202     static PassRefPtr<StringImpl> create(const LChar*, unsigned length);
203     ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s, unsigned length) { return create(reinterpret_cast<const LChar*>(s), length); }
204     WTF_EXPORT_PRIVATE static PassRefPtr<StringImpl> create(const LChar*);
205     ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s) { return create(reinterpret_cast<const LChar*>(s)); }
206
207     static ALWAYS_INLINE PassRefPtr<StringImpl> create8(PassRefPtr<StringImpl> rep, unsigned offset, unsigned length)
208     {
209         ASSERT(rep);
210         ASSERT(length <= rep->length());
211
212         if (!length)
213             return empty();
214
215         ASSERT(rep->is8Bit());
216         StringImpl* ownerRep = (rep->bufferOwnership() == BufferSubstring) ? rep->m_substringBuffer : rep.get();
217         return adoptRef(new StringImpl(rep->m_data8 + offset, length, ownerRep));
218     }
219
220     static ALWAYS_INLINE PassRefPtr<StringImpl> create(PassRefPtr<StringImpl> rep, unsigned offset, unsigned length)
221     {
222         ASSERT(rep);
223         ASSERT(length <= rep->length());
224
225         if (!length)
226             return empty();
227
228         StringImpl* ownerRep = (rep->bufferOwnership() == BufferSubstring) ? rep->m_substringBuffer : rep.get();
229         if (rep->is8Bit())
230             return adoptRef(new StringImpl(rep->m_data8 + offset, length, ownerRep));
231         return adoptRef(new StringImpl(rep->m_data16 + offset, length, ownerRep));
232     }
233
234     static PassRefPtr<StringImpl> createUninitialized(unsigned length, LChar*& data);
235     WTF_EXPORT_PRIVATE static PassRefPtr<StringImpl> createUninitialized(unsigned length, UChar*& data);
236     template <typename T> static ALWAYS_INLINE PassRefPtr<StringImpl> tryCreateUninitialized(unsigned length, T*& output)
237     {
238         if (!length) {
239             output = 0;
240             return empty();
241         }
242
243         if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof(T))) {
244             output = 0;
245             return 0;
246         }
247         StringImpl* resultImpl;
248         if (!tryFastMalloc(sizeof(T) * length + sizeof(StringImpl)).getValue(resultImpl)) {
249             output = 0;
250             return 0;
251         }
252         output = reinterpret_cast<T*>(resultImpl + 1);
253
254         if (sizeof(T) == sizeof(char))
255             return adoptRef(new (NotNull, resultImpl) StringImpl(length, Force8BitConstructor));
256
257         return adoptRef(new (NotNull, resultImpl) StringImpl(length));
258     }
259
260     // Reallocate the StringImpl. The originalString must be only owned by the PassRefPtr,
261     // and the buffer ownership must be BufferInternal. Just like the input pointer of realloc(),
262     // the originalString can't be used after this function.
263     static PassRefPtr<StringImpl> reallocate(PassRefPtr<StringImpl> originalString, unsigned length, LChar*& data);
264     static PassRefPtr<StringImpl> reallocate(PassRefPtr<StringImpl> originalString, unsigned length, UChar*& data);
265
266     static unsigned flagsOffset() { return OBJECT_OFFSETOF(StringImpl, m_hashAndFlags); }
267     static unsigned flagIs8Bit() { return s_hashFlag8BitBuffer; }
268     static unsigned dataOffset() { return OBJECT_OFFSETOF(StringImpl, m_data8); }
269     static PassRefPtr<StringImpl> createWithTerminatingNullCharacter(const StringImpl&);
270
271     template<typename CharType, size_t inlineCapacity>
272     static PassRefPtr<StringImpl> adopt(Vector<CharType, inlineCapacity>& vector)
273     {
274         if (size_t size = vector.size()) {
275             ASSERT(vector.data());
276             if (size > std::numeric_limits<unsigned>::max())
277                 CRASH();
278             return adoptRef(new StringImpl(vector.releaseBuffer(), size));
279         }
280         return empty();
281     }
282
283     static PassRefPtr<StringImpl> adopt(StringBuffer<LChar>& buffer);
284     WTF_EXPORT_PRIVATE static PassRefPtr<StringImpl> adopt(StringBuffer<UChar>& buffer);
285
286     unsigned length() const { return m_length; }
287     bool is8Bit() const { return m_hashAndFlags & s_hashFlag8BitBuffer; }
288
289     // FIXME: Remove all unnecessary usages of characters()
290     ALWAYS_INLINE const LChar* characters8() const { ASSERT(is8Bit()); return m_data8; }
291     ALWAYS_INLINE const UChar* characters16() const { ASSERT(!is8Bit()); return m_data16; }
292     ALWAYS_INLINE const UChar* characters() const
293     {
294         if (!is8Bit())
295             return m_data16;
296
297         return getData16SlowCase();
298     }
299
300     template <typename CharType>
301     ALWAYS_INLINE const CharType * getCharacters() const;
302
303     size_t cost()
304     {
305         // For substrings, return the cost of the base string.
306         if (bufferOwnership() == BufferSubstring)
307             return m_substringBuffer->cost();
308
309         if (m_hashAndFlags & s_hashFlagDidReportCost)
310             return 0;
311
312         m_hashAndFlags |= s_hashFlagDidReportCost;
313         return m_length;
314     }
315
316     bool has16BitShadow() const { return m_hashAndFlags & s_hashFlagHas16BitShadow; }
317     WTF_EXPORT_PRIVATE void upconvertCharacters(unsigned, unsigned) const;
318     bool isIdentifier() const { return m_hashAndFlags & s_hashFlagIsIdentifier; }
319     void setIsIdentifier(bool isIdentifier)
320     {
321         ASSERT(!isStatic());
322         if (isIdentifier)
323             m_hashAndFlags |= s_hashFlagIsIdentifier;
324         else
325             m_hashAndFlags &= ~s_hashFlagIsIdentifier;
326     }
327
328     bool hasTerminatingNullCharacter() const { return m_hashAndFlags & s_hashFlagHasTerminatingNullCharacter; }
329
330     bool isAtomic() const { return m_hashAndFlags & s_hashFlagIsAtomic; }
331     void setIsAtomic(bool isIdentifier)
332     {
333         ASSERT(!isStatic());
334         if (isIdentifier)
335             m_hashAndFlags |= s_hashFlagIsAtomic;
336         else
337             m_hashAndFlags &= ~s_hashFlagIsAtomic;
338     }
339
340 private:
341     // The high bits of 'hash' are always empty, but we prefer to store our flags
342     // in the low bits because it makes them slightly more efficient to access.
343     // So, we shift left and right when setting and getting our hash code.
344     void setHash(unsigned hash) const
345     {
346         ASSERT(!hasHash());
347         // Multiple clients assume that StringHasher is the canonical string hash function.
348         ASSERT(hash == (is8Bit() ? StringHasher::computeHash(m_data8, m_length) : StringHasher::computeHash(m_data16, m_length)));
349         ASSERT(!(hash & (s_flagMask << (8 * sizeof(hash) - s_flagCount)))); // Verify that enough high bits are empty.
350         
351         hash <<= s_flagCount;
352         ASSERT(!(hash & m_hashAndFlags)); // Verify that enough low bits are empty after shift.
353         ASSERT(hash); // Verify that 0 is a valid sentinel hash value.
354
355         m_hashAndFlags |= hash; // Store hash with flags in low bits.
356     }
357
358     unsigned rawHash() const
359     {
360         return m_hashAndFlags >> s_flagCount;
361     }
362
363 public:
364     bool hasHash() const
365     {
366         return rawHash() != 0;
367     }
368
369     unsigned existingHash() const
370     {
371         ASSERT(hasHash());
372         return rawHash();
373     }
374
375     unsigned hash() const
376     {
377         if (hasHash())
378             return existingHash();
379         return hashSlowCase();
380     }
381
382     inline bool hasOneRef() const
383     {
384         return m_refCount == s_refCountIncrement;
385     }
386
387     inline void ref()
388     {
389         m_refCount += s_refCountIncrement;
390     }
391
392     inline void deref()
393     {
394         if (m_refCount == s_refCountIncrement) {
395             delete this;
396             return;
397         }
398
399         m_refCount -= s_refCountIncrement;
400     }
401
402     WTF_EXPORT_PRIVATE static StringImpl* empty();
403
404     // FIXME: Does this really belong in StringImpl?
405     template <typename T> static void copyChars(T* destination, const T* source, unsigned numCharacters)
406     {
407         if (numCharacters == 1) {
408             *destination = *source;
409             return;
410         }
411
412         if (numCharacters <= s_copyCharsInlineCutOff) {
413             unsigned i = 0;
414 #if (CPU(X86) || CPU(X86_64))
415             const unsigned charsPerInt = sizeof(uint32_t) / sizeof(T);
416
417             if (numCharacters > charsPerInt) {
418                 unsigned stopCount = numCharacters & ~(charsPerInt - 1);
419
420                 const uint32_t* srcCharacters = reinterpret_cast<const uint32_t*>(source);
421                 uint32_t* destCharacters = reinterpret_cast<uint32_t*>(destination);
422                 for (unsigned j = 0; i < stopCount; i += charsPerInt, ++j)
423                     destCharacters[j] = srcCharacters[j];
424             }
425 #endif
426             for (; i < numCharacters; ++i)
427                 destination[i] = source[i];
428         } else
429             memcpy(destination, source, numCharacters * sizeof(T));
430     }
431
432     // Some string features, like refcounting and the atomicity flag, are not
433     // thread-safe. We achieve thread safety by isolation, giving each thread
434     // its own copy of the string.
435     PassRefPtr<StringImpl> isolatedCopy() const;
436
437     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> substring(unsigned pos, unsigned len = UINT_MAX);
438
439     UChar operator[](unsigned i) const
440     {
441         ASSERT(i < m_length);
442         if (is8Bit())
443             return m_data8[i];
444         return m_data16[i];
445     }
446     WTF_EXPORT_PRIVATE UChar32 characterStartingAt(unsigned);
447
448     WTF_EXPORT_PRIVATE bool containsOnlyWhitespace();
449
450     int toIntStrict(bool* ok = 0, int base = 10);
451     unsigned toUIntStrict(bool* ok = 0, int base = 10);
452     int64_t toInt64Strict(bool* ok = 0, int base = 10);
453     uint64_t toUInt64Strict(bool* ok = 0, int base = 10);
454     intptr_t toIntPtrStrict(bool* ok = 0, int base = 10);
455
456     WTF_EXPORT_PRIVATE int toInt(bool* ok = 0); // ignores trailing garbage
457     unsigned toUInt(bool* ok = 0); // ignores trailing garbage
458     int64_t toInt64(bool* ok = 0); // ignores trailing garbage
459     uint64_t toUInt64(bool* ok = 0); // ignores trailing garbage
460     intptr_t toIntPtr(bool* ok = 0); // ignores trailing garbage
461
462     // FIXME: Like the strict functions above, these give false for "ok" when there is trailing garbage.
463     // Like the non-strict functions above, these return the value when there is trailing garbage.
464     // It would be better if these were more consistent with the above functions instead.
465     double toDouble(bool* ok = 0);
466     float toFloat(bool* ok = 0);
467
468     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> lower();
469     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> upper();
470
471     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> fill(UChar);
472     // FIXME: Do we need fill(char) or can we just do the right thing if UChar is ASCII?
473     PassRefPtr<StringImpl> foldCase();
474
475     PassRefPtr<StringImpl> stripWhiteSpace();
476     PassRefPtr<StringImpl> stripWhiteSpace(IsWhiteSpaceFunctionPtr);
477     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> simplifyWhiteSpace();
478     PassRefPtr<StringImpl> simplifyWhiteSpace(IsWhiteSpaceFunctionPtr);
479
480     PassRefPtr<StringImpl> removeCharacters(CharacterMatchFunctionPtr);
481     template <typename CharType>
482     ALWAYS_INLINE PassRefPtr<StringImpl> removeCharacters(const CharType* characters, CharacterMatchFunctionPtr);
483
484     size_t find(LChar character, unsigned start = 0);
485     size_t find(char character, unsigned start = 0);
486     size_t find(UChar character, unsigned start = 0);
487     WTF_EXPORT_PRIVATE size_t find(CharacterMatchFunctionPtr, unsigned index = 0);
488     size_t find(const LChar*, unsigned index = 0);
489     ALWAYS_INLINE size_t find(const char* s, unsigned index = 0) { return find(reinterpret_cast<const LChar*>(s), index); };
490     WTF_EXPORT_PRIVATE size_t find(StringImpl*);
491     WTF_EXPORT_PRIVATE size_t find(StringImpl*, unsigned index);
492     size_t findIgnoringCase(const LChar*, unsigned index = 0);
493     ALWAYS_INLINE size_t findIgnoringCase(const char* s, unsigned index = 0) { return findIgnoringCase(reinterpret_cast<const LChar*>(s), index); };
494     WTF_EXPORT_PRIVATE size_t findIgnoringCase(StringImpl*, unsigned index = 0);
495
496     WTF_EXPORT_PRIVATE size_t reverseFind(UChar, unsigned index = UINT_MAX);
497     WTF_EXPORT_PRIVATE size_t reverseFind(StringImpl*, unsigned index = UINT_MAX);
498     WTF_EXPORT_PRIVATE size_t reverseFindIgnoringCase(StringImpl*, unsigned index = UINT_MAX);
499
500     bool startsWith(StringImpl* str, bool caseSensitive = true) { return (caseSensitive ? reverseFind(str, 0) : reverseFindIgnoringCase(str, 0)) == 0; }
501     WTF_EXPORT_PRIVATE bool startsWith(UChar) const;
502     WTF_EXPORT_PRIVATE bool startsWith(const char*, unsigned matchLength, bool caseSensitive) const;
503     template<unsigned matchLength>
504     bool startsWith(const char (&prefix)[matchLength], bool caseSensitive = true) const { return startsWith(prefix, matchLength - 1, caseSensitive); };
505
506     WTF_EXPORT_PRIVATE bool endsWith(StringImpl*, bool caseSensitive = true);
507     WTF_EXPORT_PRIVATE bool endsWith(UChar) const;
508     WTF_EXPORT_PRIVATE bool endsWith(const char*, unsigned matchLength, bool caseSensitive) const;
509     template<unsigned matchLength>
510     bool endsWith(const char (&prefix)[matchLength], bool caseSensitive = true) const { return endsWith(prefix, matchLength - 1, caseSensitive); }
511
512     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> replace(UChar, UChar);
513     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> replace(UChar, StringImpl*);
514     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> replace(StringImpl*, StringImpl*);
515     WTF_EXPORT_PRIVATE PassRefPtr<StringImpl> replace(unsigned index, unsigned len, StringImpl*);
516
517     WTF_EXPORT_PRIVATE WTF::Unicode::Direction defaultWritingDirection(bool* hasStrongDirectionality = 0);
518
519 #if USE(CF)
520     CFStringRef createCFString();
521 #endif
522 #ifdef __OBJC__
523     operator NSString*();
524 #endif
525
526 private:
527     // This number must be at least 2 to avoid sharing empty, null as well as 1 character strings from SmallStrings.
528     static const unsigned s_copyCharsInlineCutOff = 20;
529
530     BufferOwnership bufferOwnership() const { return static_cast<BufferOwnership>(m_hashAndFlags & s_hashMaskBufferOwnership); }
531     bool isStatic() const { return m_refCount & s_refCountFlagIsStaticString; }
532     template <class UCharPredicate> PassRefPtr<StringImpl> stripMatchedCharacters(UCharPredicate);
533     template <typename CharType, class UCharPredicate> PassRefPtr<StringImpl> simplifyMatchedCharactersToSpace(UCharPredicate);
534     WTF_EXPORT_PRIVATE NEVER_INLINE const UChar* getData16SlowCase() const;
535     WTF_EXPORT_PRIVATE NEVER_INLINE unsigned hashSlowCase() const;
536
537     // The bottom bit in the ref count indicates a static (immortal) string.
538     static const unsigned s_refCountFlagIsStaticString = 0x1;
539     static const unsigned s_refCountIncrement = 0x2; // This allows us to ref / deref without disturbing the static string flag.
540
541     // The bottom 8 bits in the hash are flags.
542     static const unsigned s_flagCount = 8;
543     static const unsigned s_flagMask = (1u << s_flagCount) - 1;
544     COMPILE_ASSERT(s_flagCount == StringHasher::flagCount, StringHasher_reserves_enough_bits_for_StringImpl_flags);
545
546     static const unsigned s_hashFlagHas16BitShadow = 1u << 7;
547     static const unsigned s_hashFlag8BitBuffer = 1u << 6;
548     static const unsigned s_hashFlagHasTerminatingNullCharacter = 1u << 5;
549     static const unsigned s_hashFlagIsAtomic = 1u << 4;
550     static const unsigned s_hashFlagDidReportCost = 1u << 3;
551     static const unsigned s_hashFlagIsIdentifier = 1u << 2;
552     static const unsigned s_hashMaskBufferOwnership = 1u | (1u << 1);
553
554     unsigned m_refCount;
555     unsigned m_length;
556     union {
557         const LChar* m_data8;
558         const UChar* m_data16;
559     };
560     union {
561         void* m_buffer;
562         StringImpl* m_substringBuffer;
563         mutable UChar* m_copyData16;
564     };
565     mutable unsigned m_hashAndFlags;
566 };
567
568 template <>
569 ALWAYS_INLINE const LChar* StringImpl::getCharacters<LChar>() const { return characters8(); }
570
571 template <>
572 ALWAYS_INLINE const UChar* StringImpl::getCharacters<UChar>() const { return characters(); }
573
574 WTF_EXPORT_PRIVATE bool equal(const StringImpl*, const StringImpl*);
575 WTF_EXPORT_PRIVATE bool equal(const StringImpl*, const LChar*);
576 inline bool equal(const StringImpl* a, const char* b) { return equal(a, reinterpret_cast<const LChar*>(b)); }
577 WTF_EXPORT_PRIVATE bool equal(const StringImpl*, const LChar*, unsigned);
578 inline bool equal(const StringImpl* a, const char* b, unsigned length) { return equal(a, reinterpret_cast<const LChar*>(b), length); }
579 inline bool equal(const LChar* a, StringImpl* b) { return equal(b, a); }
580 inline bool equal(const char* a, StringImpl* b) { return equal(b, reinterpret_cast<const LChar*>(a)); }
581 WTF_EXPORT_PRIVATE bool equal(const StringImpl*, const UChar*, unsigned);
582
583 // Do comparisons 8 or 4 bytes-at-a-time on architectures where it's safe.
584 #if CPU(X86_64)
585 ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length)
586 {
587     unsigned dwordLength = length >> 3;
588
589     if (dwordLength) {
590         const uint64_t* aDWordCharacters = reinterpret_cast<const uint64_t*>(a);
591         const uint64_t* bDWordCharacters = reinterpret_cast<const uint64_t*>(b);
592
593         for (unsigned i = 0; i != dwordLength; ++i) {
594             if (*aDWordCharacters++ != *bDWordCharacters++)
595                 return false;
596         }
597
598         a = reinterpret_cast<const LChar*>(aDWordCharacters);
599         b = reinterpret_cast<const LChar*>(bDWordCharacters);
600     }
601
602     if (length & 4) {
603         if (*reinterpret_cast<const uint32_t*>(a) != *reinterpret_cast<const uint32_t*>(b))
604             return false;
605
606         a += 4;
607         b += 4;
608     }
609
610     if (length & 2) {
611         if (*reinterpret_cast<const uint16_t*>(a) != *reinterpret_cast<const uint16_t*>(b))
612             return false;
613
614         a += 2;
615         b += 2;
616     }
617
618     if (length & 1 && (*a != *b))
619         return false;
620
621     return true;
622 }
623
624 ALWAYS_INLINE bool equal(const UChar* a, const UChar* b, unsigned length)
625 {
626     unsigned dwordLength = length >> 2;
627     
628     if (dwordLength) {
629         const uint64_t* aDWordCharacters = reinterpret_cast<const uint64_t*>(a);
630         const uint64_t* bDWordCharacters = reinterpret_cast<const uint64_t*>(b);
631
632         for (unsigned i = 0; i != dwordLength; ++i) {
633             if (*aDWordCharacters++ != *bDWordCharacters++)
634                 return false;
635         }
636
637         a = reinterpret_cast<const UChar*>(aDWordCharacters);
638         b = reinterpret_cast<const UChar*>(bDWordCharacters);
639     }
640
641     if (length & 2) {
642         if (*reinterpret_cast<const uint32_t*>(a) != *reinterpret_cast<const uint32_t*>(b))
643             return false;
644
645         a += 2;
646         b += 2;
647     }
648
649     if (length & 1 && (*a != *b))
650         return false;
651
652     return true;
653 }
654 #elif CPU(X86)
655 ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length)
656 {
657     const uint32_t* aCharacters = reinterpret_cast<const uint32_t*>(a);
658     const uint32_t* bCharacters = reinterpret_cast<const uint32_t*>(b);
659
660     unsigned wordLength = length >> 2;
661     for (unsigned i = 0; i != wordLength; ++i) {
662         if (*aCharacters++ != *bCharacters++)
663             return false;
664     }
665
666     length &= 3;
667
668     if (length) {
669         const LChar* aRemainder = reinterpret_cast<const LChar*>(aCharacters);
670         const LChar* bRemainder = reinterpret_cast<const LChar*>(bCharacters);
671         
672         for (unsigned i = 0; i <  length; ++i) {
673             if (aRemainder[i] != bRemainder[i])
674                 return false;
675         }
676     }
677
678     return true;
679 }
680
681 ALWAYS_INLINE bool equal(const UChar* a, const UChar* b, unsigned length)
682 {
683     const uint32_t* aCharacters = reinterpret_cast<const uint32_t*>(a);
684     const uint32_t* bCharacters = reinterpret_cast<const uint32_t*>(b);
685     
686     unsigned wordLength = length >> 1;
687     for (unsigned i = 0; i != wordLength; ++i) {
688         if (*aCharacters++ != *bCharacters++)
689             return false;
690     }
691     
692     if (length & 1 && *reinterpret_cast<const UChar*>(aCharacters) != *reinterpret_cast<const UChar*>(bCharacters))
693         return false;
694     
695     return true;
696 }
697 #else
698 ALWAYS_INLINE bool equal(const LChar* a, const LChar* b, unsigned length)
699 {
700     for (unsigned i = 0; i != length; ++i) {
701         if (a[i] != b[i])
702             return false;
703     }
704
705     return true;
706 }
707
708 ALWAYS_INLINE bool equal(const UChar* a, const UChar* b, unsigned length)
709 {
710     for (unsigned i = 0; i != length; ++i) {
711         if (a[i] != b[i])
712             return false;
713     }
714
715     return true;
716 }
717 #endif
718
719 ALWAYS_INLINE bool equal(const LChar* a, const UChar* b, unsigned length)
720 {
721     for (unsigned i = 0; i != length; ++i) {
722         if (a[i] != b[i])
723             return false;
724     }
725
726     return true;
727 }
728
729 ALWAYS_INLINE bool equal(const UChar* a, const LChar* b, unsigned length)
730 {
731     for (unsigned i = 0; i != length; ++i) {
732         if (a[i] != b[i])
733             return false;
734     }
735
736     return true;
737 }
738
739 WTF_EXPORT_PRIVATE bool equalIgnoringCase(StringImpl*, StringImpl*);
740 WTF_EXPORT_PRIVATE bool equalIgnoringCase(StringImpl*, const LChar*);
741 inline bool equalIgnoringCase(const LChar* a, StringImpl* b) { return equalIgnoringCase(b, a); }
742 WTF_EXPORT_PRIVATE bool equalIgnoringCase(const LChar*, const LChar*, unsigned);
743 WTF_EXPORT_PRIVATE bool equalIgnoringCase(const UChar*, const LChar*, unsigned);
744 inline bool equalIgnoringCase(const UChar* a, const char* b, unsigned length) { return equalIgnoringCase(a, reinterpret_cast<const LChar*>(b), length); }
745 inline bool equalIgnoringCase(const LChar* a, const UChar* b, unsigned length) { return equalIgnoringCase(b, a, length); }
746 inline bool equalIgnoringCase(const char* a, const UChar* b, unsigned length) { return equalIgnoringCase(b, reinterpret_cast<const LChar*>(a), length); }
747
748 WTF_EXPORT_PRIVATE bool equalIgnoringNullity(StringImpl*, StringImpl*);
749
750 template<typename CharacterType>
751 inline size_t find(const CharacterType* characters, unsigned length, CharacterType matchCharacter, unsigned index = 0)
752 {
753     while (index < length) {
754         if (characters[index] == matchCharacter)
755             return index;
756         ++index;
757     }
758     return notFound;
759 }
760
761 ALWAYS_INLINE size_t find(const UChar* characters, unsigned length, LChar matchCharacter, unsigned index = 0)
762 {
763     return find(characters, length, static_cast<UChar>(matchCharacter), index);
764 }
765
766 inline size_t find(const LChar* characters, unsigned length, UChar matchCharacter, unsigned index = 0)
767 {
768     if (matchCharacter & ~0xFF)
769         return notFound;
770     return find(characters, length, static_cast<LChar>(matchCharacter), index);
771 }
772
773 inline size_t find(const LChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0)
774 {
775     while (index < length) {
776         if (matchFunction(characters[index]))
777             return index;
778         ++index;
779     }
780     return notFound;
781 }
782
783 inline size_t find(const UChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0)
784 {
785     while (index < length) {
786         if (matchFunction(characters[index]))
787             return index;
788         ++index;
789     }
790     return notFound;
791 }
792
793 inline size_t reverseFind(const LChar* characters, unsigned length, LChar matchCharacter, unsigned index = UINT_MAX)
794 {
795     if (!length)
796         return notFound;
797     if (index >= length)
798         index = length - 1;
799     while (characters[index] != matchCharacter) {
800         if (!index--)
801             return notFound;
802     }
803     return index;
804 }
805
806 inline size_t reverseFind(const UChar* characters, unsigned length, UChar matchCharacter, unsigned index = UINT_MAX)
807 {
808     if (!length)
809         return notFound;
810     if (index >= length)
811         index = length - 1;
812     while (characters[index] != matchCharacter) {
813         if (!index--)
814             return notFound;
815     }
816     return index;
817 }
818
819 inline size_t StringImpl::find(LChar character, unsigned start)
820 {
821     if (is8Bit())
822         return WTF::find(characters8(), m_length, character, start);
823     return WTF::find(characters16(), m_length, character, start);
824 }
825
826 ALWAYS_INLINE size_t StringImpl::find(char character, unsigned start)
827 {
828     return find(static_cast<LChar>(character), start);
829 }
830
831 inline size_t StringImpl::find(UChar character, unsigned start)
832 {
833     if (is8Bit())
834         return WTF::find(characters8(), m_length, character, start);
835     return WTF::find(characters16(), m_length, character, start);
836 }
837
838 template<size_t inlineCapacity>
839 bool equalIgnoringNullity(const Vector<UChar, inlineCapacity>& a, StringImpl* b)
840 {
841     if (!b)
842         return !a.size();
843     if (a.size() != b->length())
844         return false;
845     return !memcmp(a.data(), b->characters(), b->length() * sizeof(UChar));
846 }
847
848 template<typename CharacterType1, typename CharacterType2>
849 static inline int codePointCompare(unsigned l1, unsigned l2, const CharacterType1* c1, const CharacterType2* c2)
850 {
851     const unsigned lmin = l1 < l2 ? l1 : l2;
852     unsigned pos = 0;
853     while (pos < lmin && *c1 == *c2) {
854         c1++;
855         c2++;
856         pos++;
857     }
858
859     if (pos < lmin)
860         return (c1[0] > c2[0]) ? 1 : -1;
861
862     if (l1 == l2)
863         return 0;
864
865     return (l1 > l2) ? 1 : -1;
866 }
867
868 static inline int codePointCompare8(const StringImpl* string1, const StringImpl* string2)
869 {
870     return codePointCompare(string1->length(), string2->length(), string1->characters8(), string2->characters8());
871 }
872
873 static inline int codePointCompare16(const StringImpl* string1, const StringImpl* string2)
874 {
875     return codePointCompare(string1->length(), string2->length(), string1->characters16(), string2->characters16());
876 }
877
878 static inline int codePointCompare8To16(const StringImpl* string1, const StringImpl* string2)
879 {
880     return codePointCompare(string1->length(), string2->length(), string1->characters8(), string2->characters16());
881 }
882
883 static inline int codePointCompare(const StringImpl* string1, const StringImpl* string2)
884 {
885     if (!string1)
886         return (string2 && string2->length()) ? -1 : 0;
887
888     if (!string2)
889         return string1->length() ? 1 : 0;
890
891     bool string1Is8Bit = string1->is8Bit();
892     bool string2Is8Bit = string2->is8Bit();
893     if (string1Is8Bit) {
894         if (string2Is8Bit)
895             return codePointCompare8(string1, string2);
896         return codePointCompare8To16(string1, string2);
897     }
898     if (string2Is8Bit)
899         return -codePointCompare8To16(string2, string1);
900     return codePointCompare16(string1, string2);
901 }
902
903 static inline bool isSpaceOrNewline(UChar c)
904 {
905     // Use isASCIISpace() for basic Latin-1.
906     // This will include newlines, which aren't included in Unicode DirWS.
907     return c <= 0x7F ? WTF::isASCIISpace(c) : WTF::Unicode::direction(c) == WTF::Unicode::WhiteSpaceNeutral;
908 }
909
910 inline PassRefPtr<StringImpl> StringImpl::isolatedCopy() const
911 {
912     if (is8Bit())
913         return create(m_data8, m_length);
914     return create(m_data16, m_length);
915 }
916
917 struct StringHash;
918
919 // StringHash is the default hash for StringImpl* and RefPtr<StringImpl>
920 template<typename T> struct DefaultHash;
921 template<> struct DefaultHash<StringImpl*> {
922     typedef StringHash Hash;
923 };
924 template<> struct DefaultHash<RefPtr<StringImpl> > {
925     typedef StringHash Hash;
926 };
927
928 }
929
930 using WTF::StringImpl;
931 using WTF::equal;
932 using WTF::TextCaseSensitivity;
933 using WTF::TextCaseSensitive;
934 using WTF::TextCaseInsensitive;
935
936 #endif