core/containers: Remove unused index class

Implements #44: Remove Index code
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-04-29 09:12:24 -04:00 committed by Anna Schumaker
parent 93fb40360d
commit 98fe6d3bbb
6 changed files with 0 additions and 250 deletions

View File

@ -1,94 +0,0 @@
/*
* Copyright 2014 (c) Anna Schumaker.
*/
#include <core/containers/index.h>
static struct index_entry *__index_alloc(gchar *key)
{
struct index_entry *ent = g_malloc(sizeof(struct index_entry));
dbe_init(&ent->ie_dbe, ent);
set_init(&ent->ie_set);
ent->ie_key = key;
return ent;
}
static struct db_entry *index_alloc(const gchar *key)
{
return &__index_alloc(g_strdup(key))->ie_dbe;
}
static void index_free(struct db_entry *dbe)
{
struct index_entry *ent = INDEX_ENTRY(dbe);
set_deinit(&ent->ie_set);
g_free(ent);
}
static gchar *index_key(struct db_entry *dbe)
{
return INDEX_ENTRY(dbe)->ie_key;
}
static void index_write(struct file *file, struct db_entry *dbe)
{
file_writef(file, "%s\n" , INDEX_ENTRY(dbe)->ie_key);
set_write(file, &INDEX_ENTRY(dbe)->ie_set);
}
static struct db_entry *index_read(struct file *file)
{
gchar *key = file_readl(file);
struct index_entry *ent;
ent = __index_alloc(key);
set_read(file, &ent->ie_set);
return &ent->ie_dbe;
}
static const struct db_ops index_ops = {
.dbe_alloc = index_alloc,
.dbe_free = index_free,
.dbe_key = index_key,
.dbe_read = index_read,
.dbe_write = index_write,
};
void index_init(struct database *index, const gchar *filepath, bool autosave)
{
db_init(index, filepath, autosave, &index_ops);
}
struct index_entry *index_insert(struct database *index, const gchar *key,
unsigned int value)
{
struct index_entry *it = INDEX_ENTRY(db_find(index, key));
set_insert(&it->ie_set, value);
db_autosave(index);
return it;
}
void index_remove(struct database *index, const gchar *key, unsigned int value)
{
struct index_entry *it = INDEX_ENTRY(db_get(index, key));
if (it) {
set_remove(&it->ie_set, value);
db_autosave(index);
}
}
bool index_has(struct database *index, const gchar *key, unsigned int value)
{
struct index_entry *it = INDEX_ENTRY(db_get(index, key));
if (!it)
return false;
return set_has(&it->ie_set, value);
}
#ifdef CONFIG_TESTING
const struct db_ops *test_index_ops() { return &index_ops; }
#endif /* CONFIG_TESTING */

View File

@ -1,38 +0,0 @@
/*
* Copyright 2014 (c) Anna Schumaker.
*
* The struct index_entry is used to associate a database key
* with a set of integers, creating an inverted index.
*/
#ifndef OCARINA_CORE_CONTAINERS_INDEX_H
#define OCARINA_CORE_CONTAINERS_INDEX_H
#include <core/containers/database.h>
#include <core/containers/set.h>
struct index_entry {
gchar *ie_key;
struct set ie_set;
struct db_entry ie_dbe;
};
#define INDEX_ENTRY(dbe) ((struct index_entry *)DBE_DATA(dbe))
/* Initialize a database for use as an index. */
void index_init(struct database *, const gchar *, bool);
/* Add a value to an index item with the specified key. */
struct index_entry *index_insert(struct database *, const gchar *, unsigned int);
/* Remove a value from an index item with the specified key. */
void index_remove(struct database *, const gchar *, unsigned int);
/* Called to check if the index has the specified (key, value) pair. */
bool index_has(struct database *, const gchar *, unsigned int);
#ifdef CONFIG_TESTING
const struct db_ops *test_index_ops();
#endif /* CONFIG_TESTING */
#endif /* OCARINA_CORE_CONTAINERS_INDEX_H */

View File

@ -8,7 +8,6 @@
#ifndef OCARINA_CORE_PLAYLIST_H
#define OCARINA_CORE_PLAYLIST_H
#include <core/containers/index.h>
#include <core/queue.h>

View File

@ -5,7 +5,6 @@ date
idle
containers/set
containers/database
containers/index
filter
tags/artist
tags/album

View File

@ -12,6 +12,5 @@ def ContainerTest(name):
res += [ ContainerTest("set") ]
res += [ ContainerTest("database") ]
res += [ ContainerTest("index") ]
Return("res")

View File

@ -1,115 +0,0 @@
/*
* Copyright 2014 (c) Anna Schumaker.
* Test a Database
*/
#include <core/containers/index.h>
#include <tests/test.h>
static void test_entry()
{
const struct db_ops *index_ops = test_index_ops();
struct index_entry *ie;
struct set_iter it;
unsigned int i;
struct file f;
ie = INDEX_ENTRY(index_ops->dbe_alloc("Link"));
test_equal(index_ops->dbe_key(&ie->ie_dbe), "Link");
set_insert(&ie->ie_set, 0);
set_insert(&ie->ie_set, 1);
set_insert(&ie->ie_set, 2);
i = 0;
set_for_each(&ie->ie_set, &it) {
test_loop_equal(it.it_val, i, i);
i++;
} test_loop_passed();
file_init(&f, "index_entry", 0, 0);
file_open(&f, OPEN_WRITE);
file_writef(&f, "Zelda\n0 \n");
index_ops->dbe_write(&f, &ie->ie_dbe);
file_close(&f);
g_free(ie->ie_key);
index_ops->dbe_free(&ie->ie_dbe);
file_open(&f, OPEN_READ);
ie = INDEX_ENTRY(index_ops->dbe_read(&f));
test_equal(index_ops->dbe_key(&ie->ie_dbe), "Zelda");
test_equal(set_size(&ie->ie_set), 0);
g_free(ie->ie_key);
index_ops->dbe_free(&ie->ie_dbe);
ie = INDEX_ENTRY(index_ops->dbe_read(&f));
test_equal(ie->ie_key, "Link");
test_equal(index_ops->dbe_key(&ie->ie_dbe), "Link");
test_equal(set_size(&ie->ie_set), 3);
file_close(&f);
i = 0;
set_for_each(&ie->ie_set, &it) {
test_loop_equal(it.it_val, i, i);
i++;
} test_loop_passed();
g_free(ie->ie_key);
index_ops->dbe_free(&ie->ie_dbe);
}
static void __test_stress(unsigned int N)
{
const struct db_ops *index_ops = test_index_ops();
struct index_entry *ie, *ie2;
struct database index;
unsigned int i;
gchar key[2] = "";
char c;
index_init(&index, "stress.idx", false);
/* index_insert() */
for (c = 'a'; c <= 'z'; c++) {
g_strlcpy(key, &c, 2);
ie = index_insert(&index, key, 0);
test_loop_not_equal((void *)ie, NULL, c - 'a');
test_loop_equal(index_ops->dbe_key(&ie->ie_dbe), key, c - 'a');
for (i = 0; i < N; i++)
ie2 = index_insert(&index, key, i);
test_loop_equal((void *)ie, (void *)ie2, c - 'a');
test_loop_equal(set_size(&ie->ie_set), N, c - 'a');
test_loop_equal(index.db_size, c - 'a' + 1, c - 'a');
} test_loop_passed();
test_equal(index.db_size, 26);
/* index_has() */
for (c = 'a'; c <= 'z'; c += 4) {
g_strlcpy(key, &c, 2);
for (i = 0; i < N; i++)
test_loop_equal(index_has(&index, key, i), (bool)true, i);
test_loop_equal(index_has(&index, key, N), (bool)false, c - 'a');
} test_loop_passed();
/* index_remove() */
for (c = 'a'; c <= 'z'; c += 4) {
g_strlcpy(key, &c, 2);
for (i = 0; i < N; i++)
index_remove(&index, key, i);
ie = INDEX_ENTRY(db_find(&index, key));
test_loop_not_equal((void *)ie, NULL, c - 'a');
test_loop_equal(set_size(&ie->ie_set), 0, c - 'a');
} test_loop_passed();
index_remove(&index, "ZZ", 42);
test_equal(index.db_size, 26);
db_deinit(&index);
}
static void test_basics() { __test_stress(10); }
static void test_stress() { __test_stress(100000); }
DECLARE_UNIT_TESTS(
UNIT_TEST("Index Entry", test_entry),
UNIT_TEST("Index Basics (N = 10)", test_basics),
UNIT_TEST("Index Stress (N = 100,000)", test_stress),
);