summaryrefslogtreecommitdiff
path: root/Userland/Applications/CharacterMap/SearchCharacters.h
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Applications/CharacterMap/SearchCharacters.h')
-rw-r--r--Userland/Applications/CharacterMap/SearchCharacters.h26
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);
+ }
+ }
+}