AK: Move StringData from String.cpp to a newly created StringInternals.h
This is done to allow using it in files other than AK/String.cpp.
This commit is contained in:
parent
855ea192be
commit
6e2f627cb3
Notes:
sideshowbarker
2024-07-18 04:38:32 +09:00
Author: https://github.com/DanShaders Commit: https://github.com/SerenityOS/serenity/commit/6e2f627cb3 Pull-request: https://github.com/SerenityOS/serenity/pull/21661 Reviewed-by: https://github.com/ADKaster Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/kleinesfilmroellchen Reviewed-by: https://github.com/trflynn89
2 changed files with 80 additions and 63 deletions
|
@ -11,6 +11,7 @@
|
|||
#include <AK/MemMem.h>
|
||||
#include <AK/Stream.h>
|
||||
#include <AK/String.h>
|
||||
#include <AK/StringInternals.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
@ -18,69 +19,6 @@ namespace AK {
|
|||
|
||||
namespace Detail {
|
||||
|
||||
class StringData final : public RefCounted<StringData> {
|
||||
public:
|
||||
static ErrorOr<NonnullRefPtr<StringData>> create_uninitialized(size_t, u8*& buffer);
|
||||
static ErrorOr<NonnullRefPtr<StringData>> create_substring(StringData const& superstring, size_t start, size_t byte_count);
|
||||
static ErrorOr<NonnullRefPtr<StringData>> from_utf8(char const* utf8_bytes, size_t);
|
||||
static ErrorOr<NonnullRefPtr<StringData>> from_stream(Stream&, size_t byte_count);
|
||||
|
||||
struct SubstringData {
|
||||
StringData const* superstring { nullptr };
|
||||
u32 start_offset { 0 };
|
||||
};
|
||||
|
||||
void operator delete(void* ptr);
|
||||
|
||||
~StringData();
|
||||
|
||||
SubstringData const& substring_data() const
|
||||
{
|
||||
return *reinterpret_cast<SubstringData const*>(m_bytes_or_substring_data);
|
||||
}
|
||||
|
||||
// NOTE: There is no guarantee about null-termination.
|
||||
ReadonlyBytes bytes() const
|
||||
{
|
||||
if (m_substring) {
|
||||
auto const& data = substring_data();
|
||||
return data.superstring->bytes().slice(data.start_offset, m_byte_count);
|
||||
}
|
||||
return { &m_bytes_or_substring_data[0], m_byte_count };
|
||||
}
|
||||
|
||||
StringView bytes_as_string_view() const { return { bytes() }; }
|
||||
|
||||
bool operator==(StringData const& other) const
|
||||
{
|
||||
return bytes_as_string_view() == other.bytes_as_string_view();
|
||||
}
|
||||
|
||||
unsigned hash() const
|
||||
{
|
||||
if (!m_has_hash)
|
||||
compute_hash();
|
||||
return m_hash;
|
||||
}
|
||||
|
||||
bool is_fly_string() const { return m_is_fly_string; }
|
||||
void set_fly_string(bool is_fly_string) const { m_is_fly_string = is_fly_string; }
|
||||
|
||||
private:
|
||||
explicit StringData(size_t byte_count);
|
||||
StringData(StringData const& superstring, size_t start, size_t byte_count);
|
||||
|
||||
void compute_hash() const;
|
||||
|
||||
u32 m_byte_count { 0 };
|
||||
mutable unsigned m_hash { 0 };
|
||||
mutable bool m_has_hash { false };
|
||||
bool m_substring { false };
|
||||
mutable bool m_is_fly_string { false };
|
||||
|
||||
alignas(SubstringData) u8 m_bytes_or_substring_data[0];
|
||||
};
|
||||
|
||||
void StringData::operator delete(void* ptr)
|
||||
{
|
||||
free(ptr);
|
||||
|
|
79
AK/StringInternals.h
Normal file
79
AK/StringInternals.h
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/NonnullRefPtr.h>
|
||||
#include <AK/RefCounted.h>
|
||||
#include <AK/Span.h>
|
||||
#include <AK/StringView.h>
|
||||
|
||||
namespace AK::Detail {
|
||||
|
||||
class StringData final : public RefCounted<StringData> {
|
||||
public:
|
||||
static ErrorOr<NonnullRefPtr<StringData>> create_uninitialized(size_t, u8*& buffer);
|
||||
static ErrorOr<NonnullRefPtr<StringData>> create_substring(StringData const& superstring, size_t start, size_t byte_count);
|
||||
static ErrorOr<NonnullRefPtr<StringData>> from_utf8(char const* utf8_bytes, size_t);
|
||||
static ErrorOr<NonnullRefPtr<StringData>> from_stream(Stream&, size_t byte_count);
|
||||
|
||||
struct SubstringData {
|
||||
StringData const* superstring { nullptr };
|
||||
u32 start_offset { 0 };
|
||||
};
|
||||
|
||||
void operator delete(void* ptr);
|
||||
|
||||
~StringData();
|
||||
|
||||
SubstringData const& substring_data() const
|
||||
{
|
||||
return *reinterpret_cast<SubstringData const*>(m_bytes_or_substring_data);
|
||||
}
|
||||
|
||||
// NOTE: There is no guarantee about null-termination.
|
||||
ReadonlyBytes bytes() const
|
||||
{
|
||||
if (m_substring) {
|
||||
auto const& data = substring_data();
|
||||
return data.superstring->bytes().slice(data.start_offset, m_byte_count);
|
||||
}
|
||||
return { &m_bytes_or_substring_data[0], m_byte_count };
|
||||
}
|
||||
|
||||
StringView bytes_as_string_view() const { return { bytes() }; }
|
||||
|
||||
bool operator==(StringData const& other) const
|
||||
{
|
||||
return bytes_as_string_view() == other.bytes_as_string_view();
|
||||
}
|
||||
|
||||
unsigned hash() const
|
||||
{
|
||||
if (!m_has_hash)
|
||||
compute_hash();
|
||||
return m_hash;
|
||||
}
|
||||
|
||||
bool is_fly_string() const { return m_is_fly_string; }
|
||||
void set_fly_string(bool is_fly_string) const { m_is_fly_string = is_fly_string; }
|
||||
|
||||
private:
|
||||
explicit StringData(size_t byte_count);
|
||||
StringData(StringData const& superstring, size_t start, size_t byte_count);
|
||||
|
||||
void compute_hash() const;
|
||||
|
||||
u32 m_byte_count { 0 };
|
||||
mutable unsigned m_hash { 0 };
|
||||
mutable bool m_has_hash { false };
|
||||
bool m_substring { false };
|
||||
mutable bool m_is_fly_string { false };
|
||||
|
||||
alignas(SubstringData) u8 m_bytes_or_substring_data[0];
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue