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