diff options
Diffstat (limited to 'Userland/Applications/CharacterMap/SearchCharacters.h')
-rw-r--r-- | Userland/Applications/CharacterMap/SearchCharacters.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/Userland/Applications/CharacterMap/SearchCharacters.h b/Userland/Applications/CharacterMap/SearchCharacters.h new file mode 100644 index 0000000000..ef5e76ee5c --- /dev/null +++ b/Userland/Applications/CharacterMap/SearchCharacters.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/String.h> +#include <LibUnicode/CharacterTypes.h> + +template<typename Callback> +void for_each_character_containing(StringView query, Callback callback) +{ + String uppercase_query = query.to_uppercase_string(); + StringView uppercase_query_view = uppercase_query.view(); + constexpr u32 maximum_code_point = 0x10FFFF; + // FIXME: There's probably a better way to do this than just looping, but it still only takes ~150ms to run for me! + for (u32 code_point = 1; code_point <= maximum_code_point; ++code_point) { + if (auto maybe_display_name = Unicode::code_point_display_name(code_point); maybe_display_name.has_value()) { + auto& display_name = maybe_display_name.value(); + if (display_name.contains(uppercase_query_view, AK::CaseSensitivity::CaseSensitive)) + callback(code_point, display_name); + } + } +} |