/* * Copyright (C) 2006, 2007, 2008, 2012, 2013 Apple Inc. All rights reserved * Copyright (C) Research In Motion Limited 2009. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/351564777): Remove this and convert code to safer constructs. #pragma allow_unsafe_buffers #endif #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_CASE_FOLDING_HASH_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_CASE_FOLDING_HASH_H_ // Case-insensitive hash lookups, using the Unicode case folding algorithm. #include "third_party/blink/renderer/platform/wtf/text/string_hash.h" #include "third_party/blink/renderer/platform/wtf/text/unicode.h" namespace WTF { // Sends the input data through the Unicode case-folding table. // Unlike normal PlainHashReader, or the ASCII lower-case lookups, // we cannot treat 8-bit and 16-bit data separately, as the lookups // may change strings from one status to the other. For instance, // µ is in Latin1, but gets case-folded to U+03BC GREEK SMALL LETTER MU, // and there are examples going the other way as well. // // We could perhaps tweak the tables to avoid this, but this is not // the most performance-sensitive hashing we have around, so we simply // always treat data as UTF-16, expanding Latin1 as we go. This means // we also don't bother to try to make tricky SIMD implementations // for Latin1; we just use the most straightforward code. (Full lookup // into WTF::unicode::FoldCase is slow enough that it probably dwarfs // all other performance concerns anyway.) template <class T> requires std::is_same_v<T, LChar> || std::is_same_v<T, UChar> struct CaseFoldingHashReader { … }; // The GetHash() functions on CaseFoldingHashTraits do not support null strings. // find(), Contains(), and insert() on // HashMap<String,..., CaseFoldingHashTraits<String>> // cause a null-pointer dereference when passed null strings. class CaseFoldingHash { … }; // T can be String, StringImpl*, scoped_refptr<StringImpl> and AtomicString. template <typename T> struct CaseFoldingHashTraits : HashTraits<T>, CaseFoldingHash { … }; } // namespace WTF CaseFoldingHash; CaseFoldingHashTraits; #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_CASE_FOLDING_HASH_H_