/* * Copyright (c) 2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { class DeprecatedFlyString { public: DeprecatedFlyString() : m_impl(StringImpl::the_empty_stringimpl()) { } DeprecatedFlyString(DeprecatedFlyString const& other) : m_impl(other.impl()) { } DeprecatedFlyString(DeprecatedFlyString&& other) : m_impl(move(other.m_impl)) { } DeprecatedFlyString(ByteString const&); DeprecatedFlyString(StringView); DeprecatedFlyString(char const* string) : DeprecatedFlyString(static_cast(string)) { } static DeprecatedFlyString from_fly_impl(NonnullRefPtr impl) { VERIFY(impl->is_fly()); DeprecatedFlyString string; string.m_impl = move(impl); return string; } DeprecatedFlyString& operator=(DeprecatedFlyString const& other) { m_impl = other.m_impl; return *this; } DeprecatedFlyString& operator=(DeprecatedFlyString&& other) { m_impl = move(other.m_impl); return *this; } bool is_empty() const { return !m_impl->length(); } bool operator==(DeprecatedFlyString const& other) const { return m_impl == other.m_impl; } bool operator==(ByteString const&) const; bool operator==(StringView) const; bool operator==(char const*) const; NonnullRefPtr impl() const { return m_impl; } char const* characters() const { return m_impl->characters(); } size_t length() const { return m_impl->length(); } ALWAYS_INLINE u32 hash() const { return m_impl->existing_hash(); } ALWAYS_INLINE StringView view() const { return m_impl->view(); } DeprecatedFlyString to_lowercase() const; template Optional to_number(TrimWhitespace trim_whitespace = TrimWhitespace::Yes) const { return view().to_number(trim_whitespace); } bool equals_ignoring_ascii_case(StringView) const; bool starts_with(StringView, CaseSensitivity = CaseSensitivity::CaseSensitive) const; bool ends_with(StringView, CaseSensitivity = CaseSensitivity::CaseSensitive) const; static void did_destroy_impl(Badge, StringImpl&); template [[nodiscard]] ALWAYS_INLINE constexpr bool is_one_of(Ts&&... strings) const { return (... || this->operator==(forward(strings))); } private: NonnullRefPtr m_impl; }; template<> struct Traits : public DefaultTraits { static unsigned hash(DeprecatedFlyString const& s) { return s.hash(); } }; } #if USING_AK_GLOBALLY using AK::DeprecatedFlyString; #endif