diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-01-19 11:34:53 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-01-19 19:00:00 -0500 |
commit | 675214574cfc5e49cb25988c126836b2487e56f9 (patch) | |
tree | ee1430258bad21f515cf03d58d600b6ad454522e /gtk/gtkcssselectorprivate.h | |
parent | 31b15bf5e0baa4ae98a92bf82842cac033d5bb03 (diff) | |
download | gtk+-matthiasc/css-matching-2.tar.gz |
css: Break the selector tree into manymatthiasc/css-matching-2
Since we can only match one name, doing a hash
by matcher name lets us quickly discard most
initial selectors, and having much smaller trees.
We can apply the same idea for style classes,
as well, by looking up a tree for each class.
Comparing the number of gtk_css_selector_match() calls
while moving the pointer outside the window, I see:
Before:
65773 selector matches (12863 positive)
After:
32704 selector matches (12278 positive)
So this cuts the numer of selectors we need to check
roughly in half, at the cost of a handful of hash table
lookups.
Diffstat (limited to 'gtk/gtkcssselectorprivate.h')
-rw-r--r-- | gtk/gtkcssselectorprivate.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/gtk/gtkcssselectorprivate.h b/gtk/gtkcssselectorprivate.h index 6f35917c6e..579d27c013 100644 --- a/gtk/gtkcssselectorprivate.h +++ b/gtk/gtkcssselectorprivate.h @@ -25,6 +25,7 @@ G_BEGIN_DECLS typedef union _GtkCssSelector GtkCssSelector; typedef struct _GtkCssSelectorTree GtkCssSelectorTree; +typedef struct _GtkCssSelectorTrees GtkCssSelectorTrees; typedef struct _GtkCssSelectorTreeBuilder GtkCssSelectorTreeBuilder; GtkCssSelector * _gtk_css_selector_parse (GtkCssParser *parser); @@ -40,14 +41,14 @@ GtkCssChange _gtk_css_selector_get_change (const GtkCssSelector *sel int _gtk_css_selector_compare (const GtkCssSelector *a, const GtkCssSelector *b); -void _gtk_css_selector_tree_free (GtkCssSelectorTree *tree); -GPtrArray * _gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree, +void _gtk_css_selector_tree_free (GtkCssSelectorTrees *tree); +GPtrArray * _gtk_css_selector_tree_match_all (const GtkCssSelectorTrees *tree, const GtkCssMatcher *matcher); -GtkCssChange _gtk_css_selector_tree_get_change_all (const GtkCssSelectorTree *tree, +GtkCssChange _gtk_css_selector_tree_get_change_all (const GtkCssSelectorTrees *tree, const GtkCssMatcher *matcher); void _gtk_css_selector_tree_match_print (const GtkCssSelectorTree *tree, GString *str); -gboolean _gtk_css_selector_tree_is_empty (const GtkCssSelectorTree *tree) G_GNUC_CONST; +gboolean _gtk_css_selector_tree_is_empty (const GtkCssSelectorTrees *tree) G_GNUC_CONST; @@ -56,7 +57,7 @@ void _gtk_css_selector_tree_builder_add (GtkCssSelectorT GtkCssSelector *selectors, GtkCssSelectorTree **selector_match, gpointer match); -GtkCssSelectorTree * _gtk_css_selector_tree_builder_build (GtkCssSelectorTreeBuilder *builder); +GtkCssSelectorTrees * _gtk_css_selector_tree_builder_build (GtkCssSelectorTreeBuilder *builder); void _gtk_css_selector_tree_builder_free (GtkCssSelectorTreeBuilder *builder); const char *gtk_css_pseudoclass_name (GtkStateFlags flags); |