15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef StringImpl_h
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define StringImpl_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits.h>
2793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/ASCIICType.h"
2893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/Forward.h"
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/HashMap.h"
3093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/StringHasher.h"
3193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/Vector.h"
3293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/WTFExport.h"
3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/unicode/Unicode.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if USE(CF)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef const struct __CFString * CFStringRef;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef __OBJC__
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)@class NSString;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)struct AlreadyHashed;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CStringTranslator;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename CharacterType> struct HashAndCharactersTranslator;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct HashAndUTF8CharactersTranslator;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct LCharBufferTranslator;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct CharBufferFromLiteralDataTranslator;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct SubstringTranslator;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct UCharBufferTranslator;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename> class RetainPtr;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum TextCaseSensitivity { TextCaseSensitive, TextCaseInsensitive };
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)enum StripBehavior { StripExtraWhiteSpace, DoNotStripWhiteSpace };
5819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef bool (*CharacterMatchFunctionPtr)(UChar);
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef bool (*IsWhiteSpaceFunctionPtr)(UChar);
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)typedef HashMap<unsigned, StringImpl*, AlreadyHashed> StaticStringsTable;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Define STRING_STATS to turn on run time statistics of string sizes and memory usage
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#undef STRING_STATS
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef STRING_STATS
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct StringStats {
687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    inline void add8BitString(unsigned length)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++m_totalNumberStrings;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++m_number8BitStrings;
727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        m_total8BitData += length;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    inline void add16BitString(unsigned length)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++m_totalNumberStrings;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++m_number16BitStrings;
797757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        m_total16BitData += length;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeString(StringImpl*);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void printStats();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const unsigned s_printStringStatsFrequency = 5000;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static unsigned s_stringRemovesTillPrintStats;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_totalNumberStrings;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_number8BitStrings;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_number16BitStrings;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned long long m_total8BitData;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned long long m_total16BitData;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void addStringForStats(StringImpl*);
9693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void removeStringForStats(StringImpl*);
9793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
9893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#define STRING_STATS_ADD_8BIT_STRING(length) StringImpl::stringStats().add8BitString(length); addStringForStats(this)
9993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#define STRING_STATS_ADD_16BIT_STRING(length) StringImpl::stringStats().add16BitString(length); addStringForStats(this)
10093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#define STRING_STATS_REMOVE_STRING(string) StringImpl::stringStats().removeString(string); removeStringForStats(this)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define STRING_STATS_ADD_8BIT_STRING(length) ((void)0)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define STRING_STATS_ADD_16BIT_STRING(length) ((void)0)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define STRING_STATS_REMOVE_STRING(string) ((void)0)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1073c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch// You can find documentation about this class in this doc:
1083c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch// https://docs.google.com/document/d/1kOCUlJdh2WJMJGDf-WoEQhmnjKLaOYRbiHz5TiGJl14/edit?usp=sharing
10993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)class WTF_EXPORT StringImpl {
11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(StringImpl);
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend struct WTF::CStringTranslator;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename CharacterType> friend struct WTF::HashAndCharactersTranslator;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend struct WTF::HashAndUTF8CharactersTranslator;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend struct WTF::CharBufferFromLiteralDataTranslator;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend struct WTF::LCharBufferTranslator;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend struct WTF::SubstringTranslator;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend struct WTF::UCharBufferTranslator;
118591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
120bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // StringImpls are allocated out of the WTF buffer partition.
121bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void* operator new(size_t);
122bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void* operator new(size_t, void* ptr) { return ptr; };
123bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void operator delete(void*);
124bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used to construct static strings, which have an special refCount that can never hit zero.
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This means that the static string will never be destroyed, which is important because
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // static strings will be shared across threads & ref-counted in a non-threadsafe manner.
128f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    enum ConstructEmptyStringTag { ConstructEmptyString };
129f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    explicit StringImpl(ConstructEmptyStringTag)
1308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        : m_refCount(1)
131f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        , m_length(0)
1321fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_hash(0)
1331fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_isAtomic(false)
1341fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_is8Bit(true)
1358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        , m_isStatic(true)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure that the hash is computed so that AtomicStringHash can call existingHash()
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // with impunity. The empty string is special because it is never entered into
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // AtomicString's HashKey, but still needs to compare correctly.
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        STRING_STATS_ADD_8BIT_STRING(m_length);
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hash();
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    enum ConstructEmptyString16BitTag { ConstructEmptyString16Bit };
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    explicit StringImpl(ConstructEmptyString16BitTag)
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : m_refCount(1)
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , m_length(0)
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , m_hash(0)
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , m_isAtomic(false)
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , m_is8Bit(false)
1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , m_isStatic(true)
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        STRING_STATS_ADD_16BIT_STRING(m_length);
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        hash();
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: there has to be a less hacky way to do this.
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum Force8Bit { Force8BitConstructor };
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringImpl(unsigned length, Force8Bit)
1608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        : m_refCount(1)
16153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        , m_length(length)
1621fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_hash(0)
1631fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_isAtomic(false)
1641fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_is8Bit(true)
1658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        , m_isStatic(false)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_length);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        STRING_STATS_ADD_8BIT_STRING(m_length);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringImpl(unsigned length)
1728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        : m_refCount(1)
17353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        , m_length(length)
1741fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_hash(0)
1751fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_isAtomic(false)
1761fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_is8Bit(false)
1778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        , m_isStatic(false)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_length);
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        STRING_STATS_ADD_16BIT_STRING(m_length);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    enum StaticStringTag { StaticString };
184f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    StringImpl(unsigned length, unsigned hash, StaticStringTag)
1858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        : m_refCount(1)
18653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        , m_length(length)
1871fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_hash(hash)
1881fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_isAtomic(false)
1891fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        , m_is8Bit(true)
1908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        , m_isStatic(true)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
19553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ~StringImpl();
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
197f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    static StringImpl* createStatic(const char* string, unsigned length, unsigned hash);
1981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    static void freezeStaticStrings();
19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static const StaticStringsTable& allStaticStrings();
20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static unsigned highestStaticStringLength() { return m_highestStaticStringLength; }
201f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
20253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static PassRefPtr<StringImpl> create(const UChar*, unsigned length);
20353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static PassRefPtr<StringImpl> create(const LChar*, unsigned length);
20453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static PassRefPtr<StringImpl> create8BitIfPossible(const UChar*, unsigned length);
205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    template<size_t inlineCapacity>
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static PassRefPtr<StringImpl> create8BitIfPossible(const Vector<UChar, inlineCapacity>& vector)
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return create8BitIfPossible(vector.data(), vector.size());
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s, unsigned length) { return create(reinterpret_cast<const LChar*>(s), length); }
21253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static PassRefPtr<StringImpl> create(const LChar*);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ALWAYS_INLINE static PassRefPtr<StringImpl> create(const char* s) { return create(reinterpret_cast<const LChar*>(s)); }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static PassRefPtr<StringImpl> createUninitialized(unsigned length, LChar*& data);
21653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static PassRefPtr<StringImpl> createUninitialized(unsigned length, UChar*& data);
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
218f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Reallocate the StringImpl. The originalString must be only owned by the PassRefPtr.
219f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Just like the input pointer of realloc(), the originalString can't be used after this function.
22009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static PassRefPtr<StringImpl> reallocate(PassRefPtr<StringImpl> originalString, unsigned length);
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2227757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // If this StringImpl has only one reference, we can truncate the string by updating
2237757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // its m_length property without actually re-allocating its buffer.
2247757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    void truncateAssumingIsolated(unsigned length)
2257757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    {
2267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        ASSERT(hasOneRef());
2277757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        ASSERT(length <= m_length);
2287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        m_length = length;
2297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
2307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() const { return m_length; }
2321fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    bool is8Bit() const { return m_is8Bit; }
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
234f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    ALWAYS_INLINE const LChar* characters8() const { ASSERT(is8Bit()); return reinterpret_cast<const LChar*>(this + 1); }
235f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    ALWAYS_INLINE const UChar* characters16() const { ASSERT(!is8Bit()); return reinterpret_cast<const UChar*>(this + 1); }
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename CharType>
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ALWAYS_INLINE const CharType * getCharacters() const;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    size_t sizeInBytes() const;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2421fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    bool isAtomic() const { return m_isAtomic; }
2431fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    void setIsAtomic(bool isAtomic) { m_isAtomic = isAtomic; }
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    bool isStatic() const { return m_isStatic; }
24653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The high bits of 'hash' are always empty, but we prefer to store our flags
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in the low bits because it makes them slightly more efficient to access.
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // So, we shift left and right when setting and getting our hash code.
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHash(unsigned hash) const
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!hasHash());
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Multiple clients assume that StringHasher is the canonical string hash function.
255f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        ASSERT(hash == (is8Bit() ? StringHasher::computeHashAndMaskTop8Bits(characters8(), m_length) : StringHasher::computeHashAndMaskTop8Bits(characters16(), m_length)));
2561fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        m_hash = hash;
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(hash); // Verify that 0 is a valid sentinel hash value.
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned rawHash() const
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2621fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        return m_hash;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    void destroyIfNotStatic();
2668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasHash() const
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return rawHash() != 0;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned existingHash() const
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(hasHash());
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return rawHash();
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned hash() const
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (hasHash())
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return existingHash();
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return hashSlowCase();
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ALWAYS_INLINE bool hasOneRef() const
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return m_refCount == 1;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ALWAYS_INLINE void ref()
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        ++m_refCount;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ALWAYS_INLINE void deref()
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (hasOneRef()) {
2998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            destroyIfNotStatic();
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        --m_refCount;
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static StringImpl* empty();
3077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static StringImpl* empty16Bit();
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Does this really belong in StringImpl?
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename T> static void copyChars(T* destination, const T* source, unsigned numCharacters)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
31207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        memcpy(destination, source, numCharacters * sizeof(T));
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ALWAYS_INLINE static void copyChars(UChar* destination, const LChar* source, unsigned numCharacters)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < numCharacters; ++i)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            destination[i] = source[i];
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Some string features, like refcounting and the atomicity flag, are not
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // thread-safe. We achieve thread safety by isolation, giving each thread
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // its own copy of the string.
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<StringImpl> isolatedCopy() const;
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> substring(unsigned pos, unsigned len = UINT_MAX);
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UChar operator[](unsigned i) const
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT_WITH_SECURITY_IMPLICATION(i < m_length);
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (is8Bit())
332f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return characters8()[i];
333f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return characters16()[i];
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
33553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    UChar32 characterStartingAt(unsigned);
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool containsOnlyWhitespace();
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int toIntStrict(bool* ok = 0, int base = 10);
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned toUIntStrict(bool* ok = 0, int base = 10);
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int64_t toInt64Strict(bool* ok = 0, int base = 10);
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint64_t toUInt64Strict(bool* ok = 0, int base = 10);
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    intptr_t toIntPtrStrict(bool* ok = 0, int base = 10);
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int toInt(bool* ok = 0); // ignores trailing garbage
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned toUInt(bool* ok = 0); // ignores trailing garbage
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int64_t toInt64(bool* ok = 0); // ignores trailing garbage
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint64_t toUInt64(bool* ok = 0); // ignores trailing garbage
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    intptr_t toIntPtr(bool* ok = 0); // ignores trailing garbage
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Like the strict functions above, these give false for "ok" when there is trailing garbage.
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Like the non-strict functions above, these return the value when there is trailing garbage.
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It would be better if these were more consistent with the above functions instead.
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double toDouble(bool* ok = 0);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float toFloat(bool* ok = 0);
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> lower();
35853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> upper();
3591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    PassRefPtr<StringImpl> lower(const AtomicString& localeIdentifier);
3601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    PassRefPtr<StringImpl> upper(const AtomicString& localeIdentifier);
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> fill(UChar);
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Do we need fill(char) or can we just do the right thing if UChar is ASCII?
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<StringImpl> foldCase();
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<StringImpl> stripWhiteSpace();
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<StringImpl> stripWhiteSpace(IsWhiteSpaceFunctionPtr);
36819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    PassRefPtr<StringImpl> simplifyWhiteSpace(StripBehavior stripBehavior = StripExtraWhiteSpace);
36919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    PassRefPtr<StringImpl> simplifyWhiteSpace(IsWhiteSpaceFunctionPtr, StripBehavior stripBehavior = StripExtraWhiteSpace);
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<StringImpl> removeCharacters(CharacterMatchFunctionPtr);
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename CharType>
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ALWAYS_INLINE PassRefPtr<StringImpl> removeCharacters(const CharType* characters, CharacterMatchFunctionPtr);
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t find(LChar character, unsigned start = 0);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t find(char character, unsigned start = 0);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t find(UChar character, unsigned start = 0);
37853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    size_t find(CharacterMatchFunctionPtr, unsigned index = 0);
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t find(const LChar*, unsigned index = 0);
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ALWAYS_INLINE size_t find(const char* s, unsigned index = 0) { return find(reinterpret_cast<const LChar*>(s), index); }
38153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    size_t find(StringImpl*);
38253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    size_t find(StringImpl*, unsigned index);
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t findIgnoringCase(const LChar*, unsigned index = 0);
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ALWAYS_INLINE size_t findIgnoringCase(const char* s, unsigned index = 0) { return findIgnoringCase(reinterpret_cast<const LChar*>(s), index); }
38553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    size_t findIgnoringCase(StringImpl*, unsigned index = 0);
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    size_t findNextLineStart(unsigned index = UINT_MAX);
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    size_t reverseFind(UChar, unsigned index = UINT_MAX);
3901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    size_t reverseFind(StringImpl*, unsigned index = UINT_MAX);
39153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    size_t reverseFindIgnoringCase(StringImpl*, unsigned index = UINT_MAX);
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
393591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    size_t count(LChar) const;
394591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool startsWith(StringImpl* str, bool caseSensitive = true) { return (caseSensitive ? reverseFind(str, 0) : reverseFindIgnoringCase(str, 0)) == 0; }
39653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool startsWith(UChar) const;
39753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool startsWith(const char*, unsigned matchLength, bool caseSensitive) const;
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<unsigned matchLength>
399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool startsWith(const char (&prefix)[matchLength], bool caseSensitive = true) const { return startsWith(prefix, matchLength - 1, caseSensitive); }
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool endsWith(StringImpl*, bool caseSensitive = true);
40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool endsWith(UChar) const;
40353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool endsWith(const char*, unsigned matchLength, bool caseSensitive) const;
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<unsigned matchLength>
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool endsWith(const char (&prefix)[matchLength], bool caseSensitive = true) const { return endsWith(prefix, matchLength - 1, caseSensitive); }
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> replace(UChar, UChar);
40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> replace(UChar, StringImpl*);
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ALWAYS_INLINE PassRefPtr<StringImpl> replace(UChar pattern, const char* replacement, unsigned replacementLength) { return replace(pattern, reinterpret_cast<const LChar*>(replacement), replacementLength); }
41053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> replace(UChar, const LChar*, unsigned replacementLength);
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<StringImpl> replace(UChar, const UChar*, unsigned replacementLength);
41253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> replace(StringImpl*, StringImpl*);
41353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PassRefPtr<StringImpl> replace(unsigned index, unsigned len, StringImpl*);
4141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    PassRefPtr<StringImpl> upconvertedString();
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if USE(CF)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RetainPtr<CFStringRef> createCFString();
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef __OBJC__
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    operator NSString*();
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef STRING_STATS
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ALWAYS_INLINE static StringStats& stringStats() { return m_stringStats; }
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
42809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    template<typename CharType> static size_t allocationSize(unsigned length)
42909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
43009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RELEASE_ASSERT(length <= ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof(CharType)));
43109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return sizeof(StringImpl) + length * sizeof(CharType);
43209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
43309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <class UCharPredicate> PassRefPtr<StringImpl> stripMatchedCharacters(UCharPredicate);
43519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    template <typename CharType, class UCharPredicate> PassRefPtr<StringImpl> simplifyMatchedCharactersToSpace(UCharPredicate, StripBehavior);
43653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    NEVER_INLINE unsigned hashSlowCase() const;
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef STRING_STATS
43953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static StringStats m_stringStats;
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
44209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static unsigned m_highestStaticStringLength;
44309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
444197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void assertHashIsCorrect()
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(hasHash());
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(existingHash() == StringHasher::computeHashAndMaskTop8Bits(characters8(), length()));
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
45353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned m_refCount;
45453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned m_length;
4551fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    mutable unsigned m_hash : 24;
4568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    unsigned m_isAtomic : 1;
4578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    unsigned m_is8Bit : 1;
4588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    unsigned m_isStatic : 1;
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <>
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE const LChar* StringImpl::getCharacters<LChar>() const { return characters8(); }
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <>
4657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen MurdochALWAYS_INLINE const UChar* StringImpl::getCharacters<UChar>() const { return characters16(); }
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equal(const StringImpl*, const StringImpl*);
46893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equal(const StringImpl*, const LChar*);
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equal(const StringImpl* a, const char* b) { return equal(a, reinterpret_cast<const LChar*>(b)); }
47093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equal(const StringImpl*, const LChar*, unsigned);
471e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochWTF_EXPORT bool equal(const StringImpl*, const UChar*, unsigned);
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equal(const StringImpl* a, const char* b, unsigned length) { return equal(a, reinterpret_cast<const LChar*>(b), length); }
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equal(const LChar* a, StringImpl* b) { return equal(b, a); }
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equal(const char* a, StringImpl* b) { return equal(b, reinterpret_cast<const LChar*>(a)); }
47593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equalNonNull(const StringImpl* a, const StringImpl* b);
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
477e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochtemplate<typename CharType>
478e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochALWAYS_INLINE bool equal(const CharType* a, const CharType* b, unsigned length) { return !memcmp(a, b, length * sizeof(CharType)); }
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE bool equal(const LChar* a, const UChar* b, unsigned length)
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
482e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    for (unsigned i = 0; i < length; ++i) {
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (a[i] != b[i])
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
489e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochALWAYS_INLINE bool equal(const UChar* a, const LChar* b, unsigned length) { return equal(b, a, length); }
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equalIgnoringCase(const StringImpl*, const StringImpl*);
49293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equalIgnoringCase(const StringImpl*, const LChar*);
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline bool equalIgnoringCase(const LChar* a, const StringImpl* b) { return equalIgnoringCase(b, a); }
49493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equalIgnoringCase(const LChar*, const LChar*, unsigned);
49593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equalIgnoringCase(const UChar*, const LChar*, unsigned);
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equalIgnoringCase(const UChar* a, const char* b, unsigned length) { return equalIgnoringCase(a, reinterpret_cast<const LChar*>(b), length); }
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equalIgnoringCase(const LChar* a, const UChar* b, unsigned length) { return equalIgnoringCase(b, a, length); }
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equalIgnoringCase(const char* a, const UChar* b, unsigned length) { return equalIgnoringCase(b, reinterpret_cast<const LChar*>(a), length); }
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equalIgnoringCase(const char* a, const LChar* b, unsigned length) { return equalIgnoringCase(b, reinterpret_cast<const LChar*>(a), length); }
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool equalIgnoringCase(const UChar* a, const UChar* b, int length)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(length >= 0);
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !Unicode::umemcasecmp(a, b, length);
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
50593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equalIgnoringCaseNonNull(const StringImpl*, const StringImpl*);
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)WTF_EXPORT bool equalIgnoringNullity(StringImpl*, StringImpl*);
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename CharacterType>
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline size_t find(const CharacterType* characters, unsigned length, CharacterType matchCharacter, unsigned index = 0)
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (index < length) {
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (characters[index] == matchCharacter)
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return index;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++index;
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
51706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return kNotFound;
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE size_t find(const UChar* characters, unsigned length, LChar matchCharacter, unsigned index = 0)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return find(characters, length, static_cast<UChar>(matchCharacter), index);
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline size_t find(const LChar* characters, unsigned length, UChar matchCharacter, unsigned index = 0)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (matchCharacter & ~0xFF)
52806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return find(characters, length, static_cast<LChar>(matchCharacter), index);
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline size_t find(const LChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0)
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (index < length) {
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (matchFunction(characters[index]))
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return index;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++index;
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
53906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return kNotFound;
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline size_t find(const UChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (index < length) {
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (matchFunction(characters[index]))
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return index;
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++index;
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
54906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return kNotFound;
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
552926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename CharacterType>
553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline size_t findNextLineStart(const CharacterType* characters, unsigned length, unsigned index = 0)
554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    while (index < length) {
556926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        CharacterType c = characters[index++];
557926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if ((c != '\n') && (c != '\r'))
558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // There can only be a start of a new line if there are more characters
561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // beyond the current character.
562926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (index < length) {
563591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            // The 3 common types of line terminators are 1. \r\n (Windows),
564926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // 2. \r (old MacOS) and 3. \n (Unix'es).
565926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (c == '\n')
567926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return index; // Case 3: just \n.
568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
569926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            CharacterType c2 = characters[index];
570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (c2 != '\n')
571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return index; // Case 2: just \r.
572926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
573926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Case 1: \r\n.
574926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // But, there's only a start of a new line if there are more
575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // characters beyond the \r\n.
576926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (++index < length)
577591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                return index;
578926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
58006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return kNotFound;
581926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
582926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename CharacterType>
584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline size_t reverseFindLineTerminator(const CharacterType* characters, unsigned length, unsigned index = UINT_MAX)
585926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
586926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!length)
58706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
588926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (index >= length)
589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        index = length - 1;
590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    CharacterType c = characters[index];
591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    while ((c != '\n') && (c != '\r')) {
592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!index--)
59306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            return kNotFound;
594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        c = characters[index];
595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return index;
597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename CharacterType>
6001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)inline size_t reverseFind(const CharacterType* characters, unsigned length, CharacterType matchCharacter, unsigned index = UINT_MAX)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!length)
60306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (index >= length)
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        index = length - 1;
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (characters[index] != matchCharacter) {
6071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (!index--)
60806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            return kNotFound;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return index;
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ALWAYS_INLINE size_t reverseFind(const UChar* characters, unsigned length, LChar matchCharacter, unsigned index = UINT_MAX)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return reverseFind(characters, length, static_cast<UChar>(matchCharacter), index);
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)inline size_t reverseFind(const LChar* characters, unsigned length, UChar matchCharacter, unsigned index = UINT_MAX)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (matchCharacter & ~0xFF)
62106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
6221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return reverseFind(characters, length, static_cast<LChar>(matchCharacter), index);
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline size_t StringImpl::find(LChar character, unsigned start)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (is8Bit())
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WTF::find(characters8(), m_length, character, start);
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WTF::find(characters16(), m_length, character, start);
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE size_t StringImpl::find(char character, unsigned start)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return find(static_cast<LChar>(character), start);
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline size_t StringImpl::find(UChar character, unsigned start)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (is8Bit())
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WTF::find(characters8(), m_length, character, start);
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WTF::find(characters16(), m_length, character, start);
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)inline unsigned lengthOfNullTerminatedString(const UChar* string)
64593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
64693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    size_t length = 0;
64793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    while (string[length] != UChar(0))
64893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ++length;
64993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    RELEASE_ASSERT(length <= std::numeric_limits<unsigned>::max());
65093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return static_cast<unsigned>(length);
65193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
65293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<size_t inlineCapacity>
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool equalIgnoringNullity(const Vector<UChar, inlineCapacity>& a, StringImpl* b)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!b)
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !a.size();
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (a.size() != b->length())
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (b->is8Bit())
6617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return equal(a.data(), b->characters8(), b->length());
6627757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return equal(a.data(), b->characters16(), b->length());
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename CharacterType1, typename CharacterType2>
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline int codePointCompare(unsigned l1, unsigned l2, const CharacterType1* c1, const CharacterType2* c2)
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned lmin = l1 < l2 ? l1 : l2;
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned pos = 0;
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (pos < lmin && *c1 == *c2) {
671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ++c1;
672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ++c2;
673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ++pos;
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pos < lmin)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (c1[0] > c2[0]) ? 1 : -1;
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (l1 == l2)
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (l1 > l2) ? 1 : -1;
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline int codePointCompare8(const StringImpl* string1, const StringImpl* string2)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return codePointCompare(string1->length(), string2->length(), string1->characters8(), string2->characters8());
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline int codePointCompare16(const StringImpl* string1, const StringImpl* string2)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return codePointCompare(string1->length(), string2->length(), string1->characters16(), string2->characters16());
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline int codePointCompare8To16(const StringImpl* string1, const StringImpl* string2)
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return codePointCompare(string1->length(), string2->length(), string1->characters8(), string2->characters16());
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline int codePointCompare(const StringImpl* string1, const StringImpl* string2)
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!string1)
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (string2 && string2->length()) ? -1 : 0;
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!string2)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return string1->length() ? 1 : 0;
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool string1Is8Bit = string1->is8Bit();
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool string2Is8Bit = string2->is8Bit();
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (string1Is8Bit) {
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (string2Is8Bit)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return codePointCompare8(string1, string2);
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return codePointCompare8To16(string1, string2);
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (string2Is8Bit)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return -codePointCompare8To16(string2, string1);
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return codePointCompare16(string1, string2);
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool isSpaceOrNewline(UChar c)
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Use isASCIISpace() for basic Latin-1.
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This will include newlines, which aren't included in Unicode DirWS.
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return c <= 0x7F ? WTF::isASCIISpace(c) : WTF::Unicode::direction(c) == WTF::Unicode::WhiteSpaceNeutral;
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline PassRefPtr<StringImpl> StringImpl::isolatedCopy() const
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (is8Bit())
730f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return create(characters8(), m_length);
731f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return create(characters16(), m_length);
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct StringHash;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// StringHash is the default hash for StringImpl* and RefPtr<StringImpl>
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename T> struct DefaultHash;
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct DefaultHash<StringImpl*> {
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef StringHash Hash;
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct DefaultHash<RefPtr<StringImpl> > {
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef StringHash Hash;
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::StringImpl;
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::equal;
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using WTF::equalNonNull;
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::TextCaseSensitivity;
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::TextCaseSensitive;
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::TextCaseInsensitive;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
755