Changeset 225751 in webkit
- Timestamp:
- Dec 11, 2017 11:22:01 AM (6 years ago)
- Location:
- trunk/Source
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r225735 r225751 1 2017-12-11 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] Add Converter traits to StringHasher instead of function pointer 4 https://bugs.webkit.org/show_bug.cgi?id=180656 5 6 Reviewed by JF Bastien. 7 8 In the latest ICU, UChar is char16_t. So defining defaultConverter(UChar) 9 and defaultConverter(char16_t) causes duplicate definitions. 10 Instead of passing a funtion pointer, we pass a trait class DefaultConveter 11 which has `convert` static function. And we make this `convert` function 12 generic. This avoids defining convert function for UChar and char16_t. 13 14 * wtf/text/StringHash.h: 15 (WTF::ASCIICaseInsensitiveHash::FoldCase::convert): 16 (WTF::ASCIICaseInsensitiveHash::hash): 17 (WTF::ASCIICaseInsensitiveHash::foldCase): Deleted. 18 * wtf/text/StringHasher.h: 19 (WTF::StringHasher::DefaultConverter::convert): 20 (WTF::StringHasher::addCharactersAssumingAligned): 21 (WTF::StringHasher::addCharacters): 22 (WTF::StringHasher::computeHashAndMaskTop8Bits): 23 (WTF::StringHasher::computeHash): 24 (WTF::StringHasher::computeLiteralHash): 25 (WTF::StringHasher::computeLiteralHashAndMaskTop8Bits): 26 (WTF::StringHasher::computeHashImpl): 27 (WTF::StringHasher::Converter): Deleted. 28 (WTF::StringHasher::defaultConverter): Deleted. 29 1 30 2017-12-10 Yusuke Suzuki <utatane.tea@gmail.com> 2 31 -
trunk/Source/WTF/wtf/text/StringHash.h
r225463 r225751 81 81 82 82 struct ASCIICaseInsensitiveHash { 83 template<typename T> static inline UChar foldCase(T character) 84 { 85 return toASCIILower(character); 86 } 83 template<typename T> 84 struct FoldCase { 85 static inline UChar convert(T character) 86 { 87 return toASCIILower(character); 88 } 89 }; 87 90 88 91 static unsigned hash(const UChar* data, unsigned length) 89 92 { 90 return StringHasher::computeHashAndMaskTop8Bits<UChar, foldCase<UChar>>(data, length);93 return StringHasher::computeHashAndMaskTop8Bits<UChar, FoldCase<UChar>>(data, length); 91 94 } 92 95 … … 105 108 static unsigned hash(const LChar* data, unsigned length) 106 109 { 107 return StringHasher::computeHashAndMaskTop8Bits<LChar, foldCase<LChar>>(data, length);110 return StringHasher::computeHashAndMaskTop8Bits<LChar, FoldCase<LChar>>(data, length); 108 111 } 109 112 -
trunk/Source/WTF/wtf/text/StringHasher.h
r225730 r225751 43 43 static constexpr const unsigned maskHash = (1U << (sizeof(unsigned) * 8 - flagCount)) - 1; 44 44 45 struct DefaultConverter { 46 template<typename CharType> 47 static constexpr UChar convert(CharType character) 48 { 49 return static_cast<std::make_unsigned_t<CharType>>((character)); 50 } 51 }; 52 45 53 StringHasher() = default; 46 54 … … 83 91 } 84 92 85 template<typename T, UChar Converter(T)> void addCharactersAssumingAligned(const T* data, unsigned length)93 template<typename T, typename Converter> void addCharactersAssumingAligned(const T* data, unsigned length) 86 94 { 87 95 ASSERT(!m_hasPendingCharacter); … … 91 99 92 100 while (length--) { 93 addCharactersAssumingAligned(Converter (data[0]), Converter(data[1]));101 addCharactersAssumingAligned(Converter::convert(data[0]), Converter::convert(data[1])); 94 102 data += 2; 95 103 } 96 104 97 105 if (remainder) 98 addCharacter(Converter (*data));106 addCharacter(Converter::convert(*data)); 99 107 } 100 108 101 109 template<typename T> void addCharactersAssumingAligned(const T* data, unsigned length) 102 110 { 103 addCharactersAssumingAligned<T, defaultConverter>(data, length);104 } 105 106 template<typename T, UChar Converter(T)> void addCharactersAssumingAligned(const T* data)111 addCharactersAssumingAligned<T, DefaultConverter>(data, length); 112 } 113 114 template<typename T, typename Converter> void addCharactersAssumingAligned(const T* data) 107 115 { 108 116 ASSERT(!m_hasPendingCharacter); … … 111 119 T b = *data++; 112 120 if (!b) { 113 addCharacter(Converter (a));121 addCharacter(Converter::convert(a)); 114 122 break; 115 123 } 116 addCharactersAssumingAligned(Converter (a), Converter(b));124 addCharactersAssumingAligned(Converter::convert(a), Converter::convert(b)); 117 125 } 118 126 } … … 120 128 template<typename T> void addCharactersAssumingAligned(const T* data) 121 129 { 122 addCharactersAssumingAligned<T, defaultConverter>(data);123 } 124 125 template<typename T, UChar Converter(T)> void addCharacters(const T* data, unsigned length)130 addCharactersAssumingAligned<T, DefaultConverter>(data); 131 } 132 133 template<typename T, typename Converter> void addCharacters(const T* data, unsigned length) 126 134 { 127 135 if (!length) … … 129 137 if (m_hasPendingCharacter) { 130 138 m_hasPendingCharacter = false; 131 addCharactersAssumingAligned(m_pendingCharacter, Converter (*data++));139 addCharactersAssumingAligned(m_pendingCharacter, Converter::convert(*data++)); 132 140 --length; 133 141 } … … 137 145 template<typename T> void addCharacters(const T* data, unsigned length) 138 146 { 139 addCharacters<T, defaultConverter>(data, length);140 } 141 142 template<typename T, UChar Converter(T)> void addCharacters(const T* data)147 addCharacters<T, DefaultConverter>(data, length); 148 } 149 150 template<typename T, typename Converter> void addCharacters(const T* data) 143 151 { 144 152 if (m_hasPendingCharacter && *data) { 145 153 m_hasPendingCharacter = false; 146 addCharactersAssumingAligned(m_pendingCharacter, Converter (*data++));154 addCharactersAssumingAligned(m_pendingCharacter, Converter::convert(*data++)); 147 155 } 148 156 addCharactersAssumingAligned<T, Converter>(data); … … 151 159 template<typename T> void addCharacters(const T* data) 152 160 { 153 addCharacters<T, defaultConverter>(data);161 addCharacters<T, DefaultConverter>(data); 154 162 } 155 163 … … 164 172 } 165 173 166 template<typename T, UChar Converter(T)> static constexpr unsigned computeHashAndMaskTop8Bits(const T* data, unsigned length)174 template<typename T, typename Converter> static constexpr unsigned computeHashAndMaskTop8Bits(const T* data, unsigned length) 167 175 { 168 176 return finalizeAndMaskTop8Bits(computeHashImpl<T, Converter>(data, length)); 169 177 } 170 178 171 template<typename T, UChar Converter(T)> static constexpr unsigned computeHashAndMaskTop8Bits(const T* data)179 template<typename T, typename Converter> static constexpr unsigned computeHashAndMaskTop8Bits(const T* data) 172 180 { 173 181 return finalizeAndMaskTop8Bits(computeHashImpl<T, Converter>(data)); … … 176 184 template<typename T> static constexpr unsigned computeHashAndMaskTop8Bits(const T* data, unsigned length) 177 185 { 178 return computeHashAndMaskTop8Bits<T, defaultConverter>(data, length);186 return computeHashAndMaskTop8Bits<T, DefaultConverter>(data, length); 179 187 } 180 188 181 189 template<typename T> static constexpr unsigned computeHashAndMaskTop8Bits(const T* data) 182 190 { 183 return computeHashAndMaskTop8Bits<T, defaultConverter>(data);184 } 185 186 template<typename T, UChar Converter(T)> static constexpr unsigned computeHash(const T* data, unsigned length)191 return computeHashAndMaskTop8Bits<T, DefaultConverter>(data); 192 } 193 194 template<typename T, typename Converter> static constexpr unsigned computeHash(const T* data, unsigned length) 187 195 { 188 196 return finalize(computeHashImpl<T, Converter>(data, length)); 189 197 } 190 198 191 template<typename T, UChar Converter(T)> static constexpr unsigned computeHash(const T* data)199 template<typename T, typename Converter> static constexpr unsigned computeHash(const T* data) 192 200 { 193 201 return finalize(computeHashImpl<T, Converter>(data)); … … 196 204 template<typename T> static constexpr unsigned computeHash(const T* data, unsigned length) 197 205 { 198 return computeHash<T, defaultConverter>(data, length);206 return computeHash<T, DefaultConverter>(data, length); 199 207 } 200 208 201 209 template<typename T> static constexpr unsigned computeHash(const T* data) 202 210 { 203 return computeHash<T, defaultConverter>(data);211 return computeHash<T, DefaultConverter>(data); 204 212 } 205 213 … … 208 216 static constexpr unsigned computeLiteralHash(const T (&characters)[charactersCount]) 209 217 { 210 return computeHash<T, defaultConverter>(characters, charactersCount - 1);218 return computeHash<T, DefaultConverter>(characters, charactersCount - 1); 211 219 } 212 220 … … 214 222 static constexpr unsigned computeLiteralHashAndMaskTop8Bits(const T (&characters)[charactersCount]) 215 223 { 216 return computeHashAndMaskTop8Bits<T, defaultConverter>(characters, charactersCount - 1);224 return computeHashAndMaskTop8Bits<T, DefaultConverter>(characters, charactersCount - 1); 217 225 } 218 226 … … 235 243 236 244 private: 237 static constexpr UChar defaultConverter(UChar character)238 {239 return character;240 }241 242 static constexpr UChar defaultConverter(LChar character)243 {244 return character;245 }246 247 static constexpr UChar defaultConverter(char character)248 {249 return static_cast<LChar>(character);250 }251 252 static constexpr UChar defaultConverter(char16_t character)253 {254 return character;255 }256 257 245 ALWAYS_INLINE static constexpr unsigned avalancheBits(unsigned hash) 258 246 { … … 313 301 } 314 302 315 template<typename T, UChar Converter(T)>303 template<typename T, typename Converter> 316 304 static constexpr unsigned computeHashImpl(const T* characters, unsigned length) 317 305 { … … 321 309 322 310 while (length--) { 323 result = calculateWithTwoCharacters(result, Converter (characters[0]), Converter(characters[1]));311 result = calculateWithTwoCharacters(result, Converter::convert(characters[0]), Converter::convert(characters[1])); 324 312 characters += 2; 325 313 } 326 314 327 315 if (remainder) 328 return calculateWithRemainingLastCharacter(result, Converter (characters[0]));329 return result; 330 } 331 332 template<typename T, UChar Converter(T)>316 return calculateWithRemainingLastCharacter(result, Converter::convert(characters[0])); 317 return result; 318 } 319 320 template<typename T, typename Converter> 333 321 static constexpr unsigned computeHashImpl(const T* characters) 334 322 { … … 337 325 T b = *characters++; 338 326 if (!b) 339 return calculateWithRemainingLastCharacter(result, Converter (a));340 result = calculateWithTwoCharacters(result, Converter (a), Converter(b));327 return calculateWithRemainingLastCharacter(result, Converter::convert(a)); 328 result = calculateWithTwoCharacters(result, Converter::convert(a), Converter::convert(b)); 341 329 } 342 330 return result; -
trunk/Source/WebKit/ChangeLog
r225747 r225751 1 2017-12-11 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] Add Converter traits to StringHasher instead of function pointer 4 https://bugs.webkit.org/show_bug.cgi?id=180656 5 6 Reviewed by JF Bastien. 7 8 * WebProcess/WebProcess.cpp: 9 (WebKit::addCaseFoldedCharacters): 10 1 11 2017-12-11 David Quesada <david_quesada@apple.com> 2 12 -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r225597 r225751 780 780 return; 781 781 if (string.is8Bit()) { 782 hasher.addCharacters<LChar, ASCIICaseInsensitiveHash:: foldCase<LChar>>(string.characters8(), string.length());783 return; 784 } 785 hasher.addCharacters<UChar, ASCIICaseInsensitiveHash:: foldCase<UChar>>(string.characters16(), string.length());782 hasher.addCharacters<LChar, ASCIICaseInsensitiveHash::FoldCase<LChar>>(string.characters8(), string.length()); 783 return; 784 } 785 hasher.addCharacters<UChar, ASCIICaseInsensitiveHash::FoldCase<UChar>>(string.characters16(), string.length()); 786 786 } 787 787
Note: See TracChangeset
for help on using the changeset viewer.