ladybird/Userland/Applications/CharacterMap/SearchCharacters.h
Sam Atkins 2a7c638cd9 CharacterMap: Add a find-by-name window
This works the same way as the command-line usage, searching against the
display name as provided by LibUnicode.

I've modified the search loop to cover every possible unicode
code-point, since my previous logic was flawed. Code-points are not
dense, there are gaps, so simply iterating up to the count of them will
skip ones with higher values. Surprisingly, iterating all 1,114,112 of
them still runs in a third of a second. Computers are fast!
2022-01-16 11:17:03 +01:00

27 lines
1005 B
C++

/*
* 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);
}
}
}