core/filter: Store track pointers directly
I was storing database indexes, but this assumes that database indexes are constant. I intend to change this with database defragmentation. Implements #46: Filter stores a track pointer Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
415bd9731a
commit
29b2b6f6f4
|
@ -18,7 +18,7 @@ void filter_deinit()
|
|||
g_hash_table_destroy(filter_index);
|
||||
}
|
||||
|
||||
void filter_add(const gchar *text, unsigned int index)
|
||||
void filter_add(const gchar *text, void *data)
|
||||
{
|
||||
const gchar *c = g_utf8_next_char(text);
|
||||
glong begin, end;
|
||||
|
@ -34,7 +34,7 @@ void filter_add(const gchar *text, unsigned int index)
|
|||
g_hash_table_insert(filter_index, substr, set);
|
||||
}
|
||||
|
||||
set_insert(set, index);
|
||||
set_insert(set, GPOINTER_TO_UINT(data));
|
||||
|
||||
if (g_unichar_isspace(g_utf8_get_char(c))) {
|
||||
c = g_utf8_next_char(c);
|
||||
|
@ -45,7 +45,7 @@ void filter_add(const gchar *text, unsigned int index)
|
|||
}
|
||||
}
|
||||
|
||||
void filter_remove(const gchar *text, unsigned int index)
|
||||
void filter_remove(const gchar *text, void *data)
|
||||
{
|
||||
const gchar *c = g_utf8_next_char(text);
|
||||
glong begin, end;
|
||||
|
@ -57,7 +57,7 @@ void filter_remove(const gchar *text, unsigned int index)
|
|||
set = g_hash_table_lookup(filter_index, substr);
|
||||
|
||||
if (set)
|
||||
set_remove(set, index);
|
||||
set_remove(set, GPOINTER_TO_UINT(data));
|
||||
|
||||
if (g_unichar_isspace(g_utf8_get_char(c))) {
|
||||
c = g_utf8_next_char(c);
|
||||
|
|
|
@ -102,9 +102,9 @@ static void track_free(struct db_entry *dbe)
|
|||
if (track->tr_library)
|
||||
track->tr_library->li_size--;
|
||||
|
||||
filter_remove(track->tr_lower, dbe->dbe_index);
|
||||
filter_remove(track->tr_artist->ar_lower, dbe->dbe_index);
|
||||
filter_remove(track->tr_album->al_lower, dbe->dbe_index);
|
||||
filter_remove(track->tr_lower, track);
|
||||
filter_remove(track->tr_artist->ar_lower, track);
|
||||
filter_remove(track->tr_album->al_lower, track);
|
||||
|
||||
g_free(track->tr_title);
|
||||
g_free(track->tr_lower);
|
||||
|
@ -115,9 +115,9 @@ static void track_setup(struct db_entry *dbe)
|
|||
{
|
||||
struct track *track = TRACK(dbe);
|
||||
|
||||
filter_add(track->tr_lower, dbe->dbe_index);
|
||||
filter_add(track->tr_artist->ar_lower, dbe->dbe_index);
|
||||
filter_add(track->tr_album->al_lower, dbe->dbe_index);
|
||||
filter_add(track->tr_lower, track);
|
||||
filter_add(track->tr_artist->ar_lower, track);
|
||||
filter_add(track->tr_album->al_lower, track);
|
||||
track->tr_library->li_size++;
|
||||
}
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ static gboolean __queue_visible_func(GtkTreeModel *model, GtkTreeIter *iter,
|
|||
return TRUE;
|
||||
|
||||
track = gui_queue_model_iter_get_track(gq_queue->gq_model, iter);
|
||||
return set_has(&gq_queue->gq_visible, track->tr_dbe.dbe_index);
|
||||
return set_has(&gq_queue->gq_visible, GPOINTER_TO_UINT(track));
|
||||
}
|
||||
|
||||
void __queue_filter(GtkSearchEntry *entry, gpointer data)
|
||||
|
|
|
@ -16,10 +16,10 @@ void filter_init();
|
|||
void filter_deinit();
|
||||
|
||||
/* Add the input string to the index. */
|
||||
void filter_add(const gchar *, unsigned int);
|
||||
void filter_add(const gchar *, void *);
|
||||
|
||||
/* Remove the input string from the index. */
|
||||
void filter_remove(const gchar *, unsigned int);
|
||||
void filter_remove(const gchar *, void *);
|
||||
|
||||
/* Search for the input string in the index. */
|
||||
void filter_search(const gchar *, struct set *);
|
||||
|
|
|
@ -30,7 +30,7 @@ static void test_filter()
|
|||
|
||||
filter_init();
|
||||
for (i = 0; i < NUM_STRINGS; i++) {
|
||||
filter_add(test_strings[i], i);
|
||||
filter_add(test_strings[i], GUINT_TO_POINTER(i));
|
||||
} test_loop_passed();
|
||||
|
||||
/* Search for a word! */
|
||||
|
@ -66,7 +66,7 @@ static void test_filter()
|
|||
test_equal(set_size(&res), 0);
|
||||
|
||||
/* Remove a string and search again. */
|
||||
filter_remove("hyrule symphony", 1);
|
||||
filter_remove("hyrule symphony", GUINT_TO_POINTER(1));
|
||||
filter_search("hyrule", &res);
|
||||
test_equal(set_size(&res), 2);
|
||||
test_equal(set_has(&res, 3), (bool)true); /* hyrule field */
|
||||
|
|
|
@ -135,15 +135,15 @@ static void test_track_filter()
|
|||
|
||||
filter_search("Title Theme", &search);
|
||||
test_equal(set_size(&search), 1);
|
||||
test_equal(set_has(&search, 0), (bool)true);
|
||||
test_equal(set_has(&search, GPOINTER_TO_UINT(track)), (bool)true);
|
||||
|
||||
filter_search("Koji Kondo", &search);
|
||||
test_equal(set_size(&search), 1);
|
||||
test_equal(set_has(&search, 0), (bool)true);
|
||||
test_equal(set_has(&search, GPOINTER_TO_UINT(track)), (bool)true);
|
||||
|
||||
filter_search("Hyrule Symphony", &search);
|
||||
test_equal(set_size(&search), 1);
|
||||
test_equal(set_has(&search, 0), (bool)true);
|
||||
test_equal(set_has(&search, GPOINTER_TO_UINT(track)), (bool)true);
|
||||
|
||||
filter_search("No Track", &search);
|
||||
test_equal(set_size(&search), 0);
|
||||
|
|
Loading…
Reference in New Issue