core/filter: Move filter_search() out of the filter namespace

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-11-10 10:12:20 -05:00
parent 90afcd6065
commit f2664aa8f2
5 changed files with 34 additions and 35 deletions

View File

@ -36,26 +36,28 @@ void filter_add(const gchar *text, unsigned int index)
}
}
void filter :: search(const std::string &text, struct set *res)
void filter_search(const gchar *text, struct set *res)
{
gchar *g_lc = string_lowercase(text.c_str());
const std::string lc = g_lc;
size_t begin = 0, end;
index_entry *found;
gchar *lower = string_lowercase(text);
struct index_entry *found;
glong begin, end;
gchar *c, *substr;
g_free(g_lc);
set_clear(res);
c = lower;
for (end = 1; end <= lc.size(); end++) {
end = lc.find(' ', begin);
if (end == std::string::npos)
end = lc.size();
for (begin = 0, end = 1; end <= g_utf8_strlen(lower, -1); end++) {
c = g_utf8_next_char(c);
if ((*c != '\0') && !g_unichar_isspace(g_utf8_get_char(c)))
continue;
substr = g_utf8_substring(lower, begin, end);
found = INDEX_ENTRY(db_get(&filter_index, substr));
g_free(substr);
found = INDEX_ENTRY(db_get(&filter_index,
lc.substr(begin, end- begin).c_str()));
if (!found) {
set_clear(res);
return;
break;
}
if (begin == 0)
@ -63,6 +65,9 @@ void filter :: search(const std::string &text, struct set *res)
else
set_inline_intersect(&found->ie_set, res);
c = g_utf8_next_char(c);
begin = ++end;
}
g_free(lower);
}

View File

@ -36,7 +36,7 @@ void QueueWindow :: filter(std::string &text)
{
_q_search_empty = (text.find_first_not_of(" \t") == std::string::npos);
if (!_q_search_empty)
filter :: search(text, &_q_search_res);
filter_search(text.c_str(), &_q_search_res);
q_filter->refilter();
}

View File

@ -23,17 +23,6 @@ extern "C" {
*/
namespace filter {
/**
* Break the input text into lowercase words and search the Index
* for matches. The results set should be filled out with the
* intersection of the IndexEntry for each word. If any word does
* not appear in the index, then the result set should be empty.
*
* @param text The text to search for.
* @param res The results set to fill in with matching indexes.
*/
void search(const std::string &, struct set *);
/**
* Converts the input text to lowercase and returns the result.
*
@ -50,4 +39,7 @@ void filter_deinit();
/* Add the input string to the index. */
void filter_add(const gchar *, unsigned int);
/* Search for the input string in the index. */
void filter_search(const gchar *, struct set *);
#endif /* OCARINA_CORE_FILTER_H */

View File

@ -34,35 +34,35 @@ static void test_filter()
} test_loop_passed();
/* Search for a word! */
filter :: search("hyrule", &res);
filter_search("hyrule", &res);
test_equal(set_size(&res), 3);
test_equal(set_has(&res, 1), (bool)true); /* hyrule symphony */
test_equal(set_has(&res, 3), (bool)true); /* hyrule field */
test_equal(set_has(&res, 4), (bool)true); /* hyrule castle */
/* A second search should clear the set. */
filter :: search("zelda", &res);
filter_search("zelda", &res);
test_equal(set_size(&res), 2);
test_equal(set_has(&res, 11), (bool)true); /* princess zelda */
test_equal(set_has(&res, 13), (bool)true); /* the legend of zelda medley */
/* Partial word search. */
filter :: search("ko", &res);
filter_search("ko", &res);
test_equal(set_size(&res), 2);
test_equal(set_has(&res, 0), (bool)true); /* koji kondo */
test_equal(set_has(&res, 2), (bool)true); /* kokiri forest */
/* Multiple word search. */
filter :: search("hyrule field", &res);
filter_search("hyrule field", &res);
test_equal(set_size(&res), 1);
test_equal(set_has(&res, 3), (bool)true); /* hyrule field */
/* Search for unknown word. */
filter :: search("field termina", &res);
filter_search("field termina", &res);
test_equal(set_size(&res), 0);
/* Search for empty string. */
filter :: search("", &res);
filter_search("", &res);
test_equal(set_size(&res), 0);
filter_deinit();

View File

@ -144,20 +144,22 @@ static void test_track_filter()
{
struct set search = SET_INIT();
filter :: search("Title Theme", &search);
filter_search("Title Theme", &search);
test_equal(set_size(&search), (size_t)1);
test_equal(set_has(&search, 0), true);
filter :: search("Koji Kondo", &search);
filter_search("Koji Kondo", &search);
test_equal(set_size(&search), (size_t)1);
test_equal(set_has(&search, 0), true);
filter :: search("Hyrule Symphony", &search);
filter_search("Hyrule Symphony", &search);
test_equal(set_size(&search), (size_t)1);
test_equal(set_has(&search, 0), true);
filter :: search("No Track", &search);
filter_search("No Track", &search);
test_equal(set_size(&search), (size_t)0);
set_deinit(&search);
}
static void test_track_compare()