diff options
author | Timothy Flynn <trflynn89@pm.me> | 2023-01-08 19:23:00 -0500 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2023-01-09 23:00:24 +0000 |
commit | f3db548a3d068c051c4d6eba970b89422a6b9522 (patch) | |
tree | df8846e5699175b425ca8d07b7b6350c0a04dcf7 /AK/DeprecatedFlyString.h | |
parent | 2eacc7aec1b2b1cc5a491727baa75817ca819bc5 (diff) | |
download | serenity-f3db548a3d068c051c4d6eba970b89422a6b9522.zip |
AK+Everywhere: Rename FlyString to DeprecatedFlyString
DeprecatedFlyString relies heavily on DeprecatedString's StringImpl, so
let's rename it to A) match the name of DeprecatedString, B) write a new
FlyString class that is tied to String.
Diffstat (limited to 'AK/DeprecatedFlyString.h')
-rw-r--r-- | AK/DeprecatedFlyString.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/AK/DeprecatedFlyString.h b/AK/DeprecatedFlyString.h new file mode 100644 index 0000000000..513cbc3134 --- /dev/null +++ b/AK/DeprecatedFlyString.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/DeprecatedString.h> +#include <AK/StringUtils.h> + +namespace AK { + +class DeprecatedFlyString { +public: + DeprecatedFlyString() = default; + DeprecatedFlyString(DeprecatedFlyString const& other) + : m_impl(other.impl()) + { + } + DeprecatedFlyString(DeprecatedFlyString&& other) + : m_impl(move(other.m_impl)) + { + } + DeprecatedFlyString(DeprecatedString const&); + DeprecatedFlyString(StringView); + DeprecatedFlyString(char const* string) + : DeprecatedFlyString(static_cast<DeprecatedString>(string)) + { + } + + static DeprecatedFlyString from_fly_impl(NonnullRefPtr<StringImpl> 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 || !m_impl->length(); } + bool is_null() const { return !m_impl; } + + bool operator==(DeprecatedFlyString const& other) const { return m_impl == other.m_impl; } + + bool operator==(DeprecatedString const&) const; + + bool operator==(StringView) const; + + bool operator==(char const*) const; + + StringImpl const* impl() const { return m_impl; } + char const* characters() const { return m_impl ? m_impl->characters() : nullptr; } + size_t length() const { return m_impl ? m_impl->length() : 0; } + + ALWAYS_INLINE u32 hash() const { return m_impl ? m_impl->existing_hash() : 0; } + ALWAYS_INLINE StringView view() const { return m_impl ? m_impl->view() : StringView {}; } + + DeprecatedFlyString to_lowercase() const; + + template<typename T = int> + Optional<T> to_int(TrimWhitespace = TrimWhitespace::Yes) const; + template<typename T = unsigned> + Optional<T> to_uint(TrimWhitespace = TrimWhitespace::Yes) const; +#ifndef KERNEL + Optional<double> to_double(TrimWhitespace = TrimWhitespace::Yes) const; + Optional<float> to_float(TrimWhitespace = TrimWhitespace::Yes) const; +#endif + + bool equals_ignoring_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>, StringImpl&); + + template<typename... Ts> + [[nodiscard]] ALWAYS_INLINE constexpr bool is_one_of(Ts... strings) const + { + return (... || this->operator==(forward<Ts>(strings))); + } + +private: + RefPtr<StringImpl> m_impl; +}; + +template<> +struct Traits<DeprecatedFlyString> : public GenericTraits<DeprecatedFlyString> { + static unsigned hash(DeprecatedFlyString const& s) { return s.hash(); } +}; + +} + +#if USING_AK_GLOBALLY +using AK::DeprecatedFlyString; +#endif |