Jelajahi Sumber

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.
Andreas Kling 2 tahun lalu
induk
melakukan
30815c25a2
2 mengubah file dengan 10 tambahan dan 0 penghapusan
  1. 5 0
      Userland/Libraries/LibCore/Object.h
  2. 5 0
      Userland/Libraries/LibGUI/Widget.h

+ 5 - 0
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); }
 

+ 5 - 0
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&);
@@ -466,6 +468,9 @@ 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> {
 };