mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-21 23:20:20 +00:00
AK: Make StringView::hash() constexpr
This required moving string_hash() to its own header so that everyone can see it.
This commit is contained in:
parent
9c38475608
commit
3e603b2f32
Notes:
sideshowbarker
2024-07-18 18:09:53 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/3e603b2f326
5 changed files with 36 additions and 25 deletions
27
AK/StringHash.h
Normal file
27
AK/StringHash.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2021, the SerenityOS developers.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace AK {
|
||||
|
||||
constexpr u32 string_hash(char const* characters, size_t length)
|
||||
{
|
||||
u32 hash = 0;
|
||||
for (size_t i = 0; i < length; ++i) {
|
||||
hash += (u32)characters[i];
|
||||
hash += (hash << 10);
|
||||
hash ^= (hash >> 6);
|
||||
}
|
||||
hash += hash << 3;
|
||||
hash ^= hash >> 11;
|
||||
hash += hash << 15;
|
||||
return hash;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
using AK::string_hash;
|
|
@ -6,9 +6,9 @@
|
|||
|
||||
#include <AK/Debug.h>
|
||||
#include <AK/FlyString.h>
|
||||
#include <AK/HashTable.h>
|
||||
#include <AK/Memory.h>
|
||||
#include <AK/StdLibExtras.h>
|
||||
#include <AK/StringHash.h>
|
||||
#include <AK/StringImpl.h>
|
||||
#include <AK/kmalloc.h>
|
||||
|
||||
|
|
|
@ -96,20 +96,6 @@ private:
|
|||
char m_inline_buffer[0];
|
||||
};
|
||||
|
||||
constexpr u32 string_hash(const char* characters, size_t length)
|
||||
{
|
||||
u32 hash = 0;
|
||||
for (size_t i = 0; i < length; ++i) {
|
||||
hash += (u32)characters[i];
|
||||
hash += (hash << 10);
|
||||
hash ^= (hash >> 6);
|
||||
}
|
||||
hash += hash << 3;
|
||||
hash ^= hash >> 11;
|
||||
hash += hash << 15;
|
||||
return hash;
|
||||
}
|
||||
|
||||
template<>
|
||||
struct Formatter<StringImpl> : Formatter<StringView> {
|
||||
void format(FormatBuilder& builder, const StringImpl& value)
|
||||
|
@ -122,5 +108,4 @@ struct Formatter<StringImpl> : Formatter<StringView> {
|
|||
|
||||
using AK::Chomp;
|
||||
using AK::NoChomp;
|
||||
using AK::string_hash;
|
||||
using AK::StringImpl;
|
||||
|
|
|
@ -214,13 +214,6 @@ template Optional<u64> StringView::to_uint() const;
|
|||
template Optional<long> StringView::to_uint() const;
|
||||
template Optional<long long> StringView::to_uint() const;
|
||||
|
||||
unsigned StringView::hash() const
|
||||
{
|
||||
if (is_empty())
|
||||
return 0;
|
||||
return string_hash(characters_without_null_termination(), length());
|
||||
}
|
||||
|
||||
bool StringView::operator==(const String& string) const
|
||||
{
|
||||
if (string.is_null())
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <AK/Forward.h>
|
||||
#include <AK/Span.h>
|
||||
#include <AK/StdLibExtras.h>
|
||||
#include <AK/StringHash.h>
|
||||
#include <AK/StringUtils.h>
|
||||
#include <AK/Vector.h>
|
||||
|
||||
|
@ -49,7 +50,7 @@ public:
|
|||
[[nodiscard]] constexpr bool is_null() const { return !m_characters; }
|
||||
[[nodiscard]] constexpr bool is_empty() const { return m_length == 0; }
|
||||
|
||||
[[nodiscard]] const char* characters_without_null_termination() const { return m_characters; }
|
||||
[[nodiscard]] constexpr char const* characters_without_null_termination() const { return m_characters; }
|
||||
[[nodiscard]] constexpr size_t length() const { return m_length; }
|
||||
|
||||
[[nodiscard]] ReadonlyBytes bytes() const { return { m_characters, m_length }; }
|
||||
|
@ -61,7 +62,12 @@ public:
|
|||
[[nodiscard]] constexpr ConstIterator begin() const { return ConstIterator::begin(*this); }
|
||||
[[nodiscard]] constexpr ConstIterator end() const { return ConstIterator::end(*this); }
|
||||
|
||||
[[nodiscard]] unsigned hash() const;
|
||||
[[nodiscard]] constexpr unsigned hash() const
|
||||
{
|
||||
if (is_empty())
|
||||
return 0;
|
||||
return string_hash(characters_without_null_termination(), length());
|
||||
}
|
||||
|
||||
[[nodiscard]] bool starts_with(const StringView&, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
|
||||
[[nodiscard]] bool ends_with(const StringView&, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
|
||||
|
|
Loading…
Reference in a new issue