From 63b46b61612c3197a010d24e8e544f4d515b1523 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 29 Apr 2016 10:17:54 -0400 Subject: [PATCH] core/filter: Implement copy and intersect directly I intend to remove the set class, so we still need a way to handle filter results. Signed-off-by: Anna Schumaker --- core/filter.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/core/filter.c b/core/filter.c index 2956adf0..747b7309 100644 --- a/core/filter.c +++ b/core/filter.c @@ -7,6 +7,29 @@ static GHashTable *filter_index = NULL; +void __filter_copy(const struct set *lhs, struct set *rhs) +{ + GHashTableIter iter; + gpointer data; + + g_hash_table_iter_init(&iter, lhs->s_set); + while (g_hash_table_iter_next(&iter, &data, NULL)) + set_insert(rhs, GPOINTER_TO_UINT(data)); +} + +void __filter_inline_intersect(const struct set *lhs, struct set *rhs) +{ + GHashTableIter iter; + gpointer data; + + g_hash_table_iter_init(&iter, rhs->s_set); + while (g_hash_table_iter_next(&iter, &data, NULL)) { + if (!set_has(lhs, GPOINTER_TO_UINT(data))) + g_hash_table_iter_remove(&iter); + } +} + + void filter_init() { filter_index = g_hash_table_new_full(g_str_hash, g_str_equal, @@ -93,9 +116,9 @@ void filter_search(const gchar *text, struct set *res) } if (begin == 0) - set_copy(found, res); + __filter_copy(found, res); else - set_inline_intersect(found, res); + __filter_inline_intersect(found, res); c = g_utf8_next_char(c); begin = ++end;