summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-09-30 17:59:41 +0200
committerAndreas Kling <kling@serenityos.org>2022-09-30 18:00:55 +0200
commit30815c25a20b4bb6a9f7943badb244cbe60b3483 (patch)
treea9144e933c6fad4876a4b2a3e7a7599c95e4c5f6 /Userland
parent1cff5fe2ffa9dc0c922263e95cb62563ef9a1887 (diff)
downloadserenity-30815c25a20b4bb6a9f7943badb244cbe60b3483.zip
LibCore+LibGUI: Make it fast to check if a Core::Object is a Widget
This check happens very often in LibGUI code. 25% of time spent layouting the emoji input dialog was wasted on RTTI. Adding a simple fast_is<Widget>() melts almost all of that away.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibCore/Object.h5
-rw-r--r--Userland/Libraries/LibGUI/Widget.h5
2 files changed, 10 insertions, 0 deletions
diff --git a/Userland/Libraries/LibCore/Object.h b/Userland/Libraries/LibCore/Object.h
index 33a1fbf443..69c3203e34 100644
--- a/Userland/Libraries/LibCore/Object.h
+++ b/Userland/Libraries/LibCore/Object.h
@@ -98,6 +98,11 @@ public:
virtual StringView class_name() const = 0;
+ template<typename T>
+ bool fast_is() const = delete;
+
+ virtual bool is_widget() const { return false; }
+
String const& name() const { return m_name; }
void set_name(String name) { m_name = move(name); }
diff --git a/Userland/Libraries/LibGUI/Widget.h b/Userland/Libraries/LibGUI/Widget.h
index c90672ebd4..04567e6f05 100644
--- a/Userland/Libraries/LibGUI/Widget.h
+++ b/Userland/Libraries/LibGUI/Widget.h
@@ -404,6 +404,8 @@ protected:
void show_or_hide_tooltip();
private:
+ virtual bool is_widget() const final { return true; }
+
void handle_paint_event(PaintEvent&);
void handle_resize_event(ResizeEvent&);
void handle_mousedown_event(MouseEvent&);
@@ -467,5 +469,8 @@ inline Widget const* Widget::parent_widget() const
}
template<>
+inline bool Core::Object::fast_is<GUI::Widget>() const { return is_widget(); }
+
+template<>
struct AK::Formatter<GUI::Widget> : AK::Formatter<Core::Object> {
};