/* * Copyright (c) 2021-2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace JS { namespace Detail { class Utf16StringImpl : public RefCounted { public: ~Utf16StringImpl() = default; [[nodiscard]] static NonnullRefPtr create(); [[nodiscard]] static NonnullRefPtr create(Utf16Data); [[nodiscard]] static NonnullRefPtr create(StringView); [[nodiscard]] static NonnullRefPtr create(Utf16View const&); Utf16Data const& string() const; Utf16View view() const; private: Utf16StringImpl() = default; explicit Utf16StringImpl(Utf16Data string); Utf16Data m_string; }; } class Utf16String { public: [[nodiscard]] static Utf16String create(); [[nodiscard]] static Utf16String create(Utf16Data); [[nodiscard]] static Utf16String create(StringView); [[nodiscard]] static Utf16String create(Utf16View const&); Utf16Data const& string() const; Utf16View view() const; Utf16View substring_view(size_t code_unit_offset, size_t code_unit_length) const; Utf16View substring_view(size_t code_unit_offset) const; [[nodiscard]] String to_utf8() const; [[nodiscard]] ByteString to_byte_string() const; u16 code_unit_at(size_t index) const; size_t length_in_code_units() const; bool is_empty() const; private: explicit Utf16String(NonnullRefPtr); NonnullRefPtr m_string; }; }