18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
4f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * Copyright (C) 2009 Google Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
6f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * This library is free software; you can redistribute it and/or
7f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * modify it under the terms of the GNU Library General Public
8f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * License as published by the Free Software Foundation; either
9f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
11f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * This library is distributed in the hope that it will be useful,
12f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * but WITHOUT ANY WARRANTY; without even the implied warranty of
13f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
16f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * You should have received a copy of the GNU Library General Public License
17f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * along with this library; see the file COPYING.LIB.  If not, write to
18f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef UString_h
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define UString_h
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/StringImpl.h>
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickclass UString {
31f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickpublic:
32f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Construct a null string, distinguishable from an empty string.
33f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString() { }
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Construct a string with UTF-16 data.
36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString(const UChar* characters, unsigned length);
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Construct a string with UTF-16 data, from a null-terminated source.
39f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString(const UChar*);
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Construct a string with latin1 data.
42f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString(const char* characters, unsigned length);
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Construct a string with latin1 data, from a null-terminated source.
45f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString(const char* characters);
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Construct a string referencing an existing StringImpl.
48f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString(StringImpl* impl) : m_impl(impl) { }
49f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString(PassRefPtr<StringImpl> impl) : m_impl(impl) { }
50f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString(RefPtr<StringImpl> impl) : m_impl(impl) { }
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Inline the destructor.
53f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    ALWAYS_INLINE ~UString() { }
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    void swap(UString& o) { m_impl.swap(o.m_impl); }
565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
57f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    template<size_t inlineCapacity>
58f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static UString adopt(Vector<UChar, inlineCapacity>& vector) { return StringImpl::adopt(vector); }
598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
60f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    bool isNull() const { return !m_impl; }
61f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    bool isEmpty() const { return !m_impl || !m_impl->length(); }
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    StringImpl* impl() const { return m_impl.get(); }
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned length() const
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
67f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (!m_impl)
68692e5dbf12901edacf14812a6fae25462920af42Steve Block            return 0;
69f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return m_impl->length();
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
72f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    const UChar* characters() const
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
74f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (!m_impl)
758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            return 0;
76f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return m_impl->characters();
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
79f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    CString ascii() const;
80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    CString latin1() const;
81f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    CString utf8(bool strict = false) const;
82f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UChar operator[](unsigned index) const
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
85f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (!m_impl || index >= m_impl->length())
868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            return 0;
87f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return m_impl->characters()[index];
88f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
89d0825bca7fe65beaee391d30da42e937db621564Steve Block
90f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static UString number(int);
91f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static UString number(unsigned);
92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static UString number(long);
93f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static UString number(long long);
94f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static UString number(double);
95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
96f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Find a single character or string, also with match function & latin1 forms.
97f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t find(UChar c, unsigned start = 0) const
98f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        { return m_impl ? m_impl->find(c, start) : notFound; }
99f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t find(const UString& str, unsigned start = 0) const
100f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        { return m_impl ? m_impl->find(str.impl(), start) : notFound; }
101f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t find(const char* str, unsigned start = 0) const
102f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        { return m_impl ? m_impl->find(str, start) : notFound; }
103f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
104f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Find the last instance of a single character or string.
105f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t reverseFind(UChar c, unsigned start = UINT_MAX) const
106f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        { return m_impl ? m_impl->reverseFind(c, start) : notFound; }
107f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t reverseFind(const UString& str, unsigned start = UINT_MAX) const
108f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        { return m_impl ? m_impl->reverseFind(str.impl(), start) : notFound; }
109f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
110f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    UString substringSharingImpl(unsigned pos, unsigned len = UINT_MAX) const;
111f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
112f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickprivate:
113f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<StringImpl> m_impl;
114f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick};
115f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
116f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickALWAYS_INLINE bool operator==(const UString& s1, const UString& s2)
117f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
118f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    StringImpl* rep1 = s1.impl();
119f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    StringImpl* rep2 = s2.impl();
120f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned size1 = 0;
121f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned size2 = 0;
122f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
123f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (rep1 == rep2) // If they're the same rep, they're equal.
124f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
125f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
126f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (rep1)
127f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        size1 = rep1->length();
128f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
129f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (rep2)
130f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        size2 = rep2->length();
131f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
132f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (size1 != size2) // If the lengths are not the same, we're done.
133f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return false;
134f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
135f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!size1)
136f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
137f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
138f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // At this point we know
139f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    //   (a) that the strings are the same length and
140f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    //   (b) that they are greater than zero length.
141f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    const UChar* d1 = rep1->characters();
142f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    const UChar* d2 = rep2->characters();
143f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
144f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (d1 == d2) // Check to see if the data pointers are the same.
145f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
146f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
147f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Do quick checks for sizes 1 and 2.
148f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    switch (size1) {
149f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case 1:
150f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return d1[0] == d2[0];
151f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case 2:
152f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return (d1[0] == d2[0]) & (d1[1] == d2[1]);
153f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    default:
154f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return memcmp(d1, d2, size1 * sizeof(UChar)) == 0;
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
156f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
158d0825bca7fe65beaee391d30da42e937db621564Steve Block
159f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickinline bool operator!=(const UString& s1, const UString& s2)
160f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
161f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return !JSC::operator==(s1, s2);
162f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
164f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool operator<(const UString& s1, const UString& s2);
165f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool operator>(const UString& s1, const UString& s2);
166d0825bca7fe65beaee391d30da42e937db621564Steve Block
167f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool operator==(const UString& s1, const char* s2);
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
169f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickinline bool operator!=(const UString& s1, const char* s2)
170f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
171f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return !JSC::operator==(s1, s2);
172f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
173d0825bca7fe65beaee391d30da42e937db621564Steve Block
174f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickinline bool operator==(const char *s1, const UString& s2)
175f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
176f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return operator==(s2, s1);
177f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
179f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickinline bool operator!=(const char *s1, const UString& s2)
180f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
181f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return !JSC::operator==(s1, s2);
182f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
183d0825bca7fe65beaee391d30da42e937db621564Steve Block
184f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickinline int codePointCompare(const UString& s1, const UString& s2)
185f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
186f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return codePointCompare(s1.impl(), s2.impl());
187f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
189f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickstruct UStringHash {
190f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static unsigned hash(StringImpl* key) { return key->hash(); }
191f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static bool equal(const StringImpl* a, const StringImpl* b)
1928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    {
193f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (a == b)
194f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return true;
195f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (!a || !b)
196f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
1978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
198f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned aLength = a->length();
199f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned bLength = b->length();
200f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (aLength != bLength)
201f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
2028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
203f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        // FIXME: perhaps we should have a more abstract macro that indicates when
204f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        // going 4 bytes at a time is unsafe
2054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#if CPU(ARM) || CPU(SH4) || CPU(MIPS)
206f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UChar* aChars = a->characters();
207f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const UChar* bChars = b->characters();
208f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        for (unsigned i = 0; i != aLength; ++i) {
209f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            if (*aChars++ != *bChars++)
210f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                return false;
211f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        }
212f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
213f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#else
214f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        /* Do it 4-bytes-at-a-time on architectures where it's safe */
215f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const uint32_t* aChars = reinterpret_cast<const uint32_t*>(a->characters());
216f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        const uint32_t* bChars = reinterpret_cast<const uint32_t*>(b->characters());
217f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
218f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned halfLength = aLength >> 1;
219f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        for (unsigned i = 0; i != halfLength; ++i)
220f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            if (*aChars++ != *bChars++)
221f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                return false;
222f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
223f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (aLength & 1 && *reinterpret_cast<const uint16_t*>(aChars) != *reinterpret_cast<const uint16_t*>(bChars))
224f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return false;
2258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
226f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
227f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif
2288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
2298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
230f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static unsigned hash(const RefPtr<StringImpl>& key) { return key->hash(); }
231f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static bool equal(const RefPtr<StringImpl>& a, const RefPtr<StringImpl>& b)
2328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    {
233f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return equal(a.get(), b.get());
2348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
2358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
236f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static unsigned hash(const UString& key) { return key.impl()->hash(); }
237f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static bool equal(const UString& a, const UString& b)
2388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    {
239f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return equal(a.impl(), b.impl());
2408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
2418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
242f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    static const bool safeToCompareToEmptyOrDeleted = false;
243f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick};
2448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WTF {
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
249f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick// UStringHash is the default hash for UString
250f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> struct DefaultHash;
251f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<> struct DefaultHash<JSC::UString> {
252f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    typedef JSC::UStringHash Hash;
253f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick};
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochtemplate <> struct VectorTraits<JSC::UString> : SimpleClassVectorTraits { };
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WTF
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
260f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
261