/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2020, Fei Wu * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { namespace Detail { template inline constexpr bool IsHashCompatible = true; } enum class CaseSensitivity { CaseInsensitive, CaseSensitive, }; enum class ReplaceMode { All, FirstOnly, }; enum class TrimMode { Left, Right, Both }; enum class TrimWhitespace { Yes, No, }; struct MaskSpan { size_t start; size_t length; bool operator==(MaskSpan const& other) const { return start == other.start && length == other.length; } bool operator!=(MaskSpan const& other) const { return !(*this == other); } }; namespace StringUtils { bool matches(StringView str, StringView mask, CaseSensitivity = CaseSensitivity::CaseInsensitive, Vector* match_spans = nullptr); template Optional convert_to_int(StringView, TrimWhitespace = TrimWhitespace::Yes); template Optional convert_to_uint(StringView, TrimWhitespace = TrimWhitespace::Yes); template Optional convert_to_uint_from_hex(StringView, TrimWhitespace = TrimWhitespace::Yes); template Optional convert_to_uint_from_octal(StringView, TrimWhitespace = TrimWhitespace::Yes); #ifndef KERNEL template Optional convert_to_floating_point(StringView, TrimWhitespace = TrimWhitespace::Yes); #endif bool equals_ignoring_case(StringView, StringView); bool ends_with(StringView a, StringView b, CaseSensitivity); bool starts_with(StringView, StringView, CaseSensitivity); bool contains(StringView, StringView, CaseSensitivity); bool is_whitespace(StringView); StringView trim(StringView string, StringView characters, TrimMode mode); StringView trim_whitespace(StringView string, TrimMode mode); Optional find(StringView haystack, char needle, size_t start = 0); Optional find(StringView haystack, StringView needle, size_t start = 0); Optional find_last(StringView haystack, char needle); Optional find_last_not(StringView haystack, char needle); Vector find_all(StringView haystack, StringView needle); enum class SearchDirection { Forward, Backward }; Optional find_any_of(StringView haystack, StringView needles, SearchDirection); String to_snakecase(StringView); String to_titlecase(StringView); String invert_case(StringView); String replace(StringView, StringView needle, StringView replacement, ReplaceMode); size_t count(StringView, StringView needle); } } using AK::CaseSensitivity; using AK::ReplaceMode; using AK::TrimMode; using AK::TrimWhitespace;