diff options
author | Timothy Flynn <trflynn89@pm.me> | 2021-08-09 08:58:31 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-10 23:07:50 +0200 |
commit | 02e7dceb96a5cbb3795deaf08ba829010ac07d28 (patch) | |
tree | 04cb2d15a42962e43825fe22a27a0f4d5fcf0eeb /Userland/Libraries/LibJS/Runtime/Utf16String.cpp | |
parent | 3322efd4cdb19389e9a55dd5a0e02b688a594c17 (diff) | |
download | serenity-02e7dceb96a5cbb3795deaf08ba829010ac07d28.zip |
LibJS: Add a simple reference-counted UTF-16 string
To help alleviate memory usage when creating and copying large strings,
create a simple wrapper around a Vector<u16> to reference count UTF-16
strings.
Diffstat (limited to 'Userland/Libraries/LibJS/Runtime/Utf16String.cpp')
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/Utf16String.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Utf16String.cpp b/Userland/Libraries/LibJS/Runtime/Utf16String.cpp new file mode 100644 index 0000000000..b2e40c252f --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/Utf16String.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <AK/StringView.h> +#include <AK/Utf16View.h> +#include <LibJS/Runtime/Utf16String.h> + +namespace JS { +namespace Detail { + +static NonnullRefPtr<Utf16StringImpl> the_empty_utf16_string() +{ + static NonnullRefPtr<Utf16StringImpl> empty_string = Utf16StringImpl::create(); + return empty_string; +} + +Utf16StringImpl::Utf16StringImpl(Vector<u16> string) + : m_string(move(string)) +{ +} + +NonnullRefPtr<Utf16StringImpl> Utf16StringImpl::create() +{ + return adopt_ref(*new Utf16StringImpl()); +} + +NonnullRefPtr<Utf16StringImpl> Utf16StringImpl::create(Vector<u16> string) +{ + return adopt_ref(*new Utf16StringImpl(move(string))); +} + +NonnullRefPtr<Utf16StringImpl> Utf16StringImpl::create(StringView const& string) +{ + return create(AK::utf8_to_utf16(string)); +} + +NonnullRefPtr<Utf16StringImpl> Utf16StringImpl::create(Utf16View const& view) +{ + Vector<u16> string; + string.ensure_capacity(view.length_in_code_units()); + string.append(view.data(), view.length_in_code_units()); + return create(move(string)); +} + +Vector<u16> const& Utf16StringImpl::string() const +{ + return m_string; +} + +Utf16View Utf16StringImpl::view() const +{ + return Utf16View { m_string }; +} + +} + +Utf16String::Utf16String() + : m_string(Detail::the_empty_utf16_string()) +{ +} + +Utf16String::Utf16String(Vector<u16> string) + : m_string(Detail::Utf16StringImpl::create(move(string))) +{ +} + +Utf16String::Utf16String(StringView const& string) + : m_string(Detail::Utf16StringImpl::create(move(string))) +{ +} + +Utf16String::Utf16String(Utf16View const& string) + : m_string(Detail::Utf16StringImpl::create(move(string))) +{ +} + +Vector<u16> const& Utf16String::string() const +{ + return m_string->string(); +} + +Utf16View Utf16String::view() const +{ + return m_string->view(); +} + +Utf16View Utf16String::substring_view(size_t code_unit_offset, size_t code_unit_length) const +{ + return view().substring_view(code_unit_offset, code_unit_length); +} + +Utf16View Utf16String::substring_view(size_t code_unit_offset) const +{ + return view().substring_view(code_unit_offset); +} + +String Utf16String::to_utf8() const +{ + return view().to_utf8(Utf16View::AllowInvalidCodeUnits::Yes); +} + +u16 Utf16String::code_unit_at(size_t index) const +{ + return view().code_unit_at(index); +} + +size_t Utf16String::length_in_code_units() const +{ + return view().length_in_code_units(); +} + +bool Utf16String::is_empty() const +{ + return view().is_empty(); +} + +} |