core/index: Replace index_entry constructor with backwards pointer

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-11-06 09:59:07 -05:00
parent b28b0c8464
commit 507ac4602d
3 changed files with 45 additions and 44 deletions

View File

@ -4,48 +4,46 @@
#include <core/index.h>
index_entry :: index_entry()
static struct index_entry *__index_alloc(gchar *key)
{
ie_set = SET_INIT();
struct index_entry *ent = new struct index_entry;
dbe_init(&ent->ie_dbe, ent);
ent->ie_set = SET_INIT();
ent->ie_key = key;
return ent;
}
static struct db_entry *index_alloc(const gchar *key)
{
struct index_entry *ent = new struct index_entry;
ent->ie_key = key;
return ent;
return &__index_alloc(g_strdup(key))->ie_dbe;
}
static void index_free(struct db_entry *dbe)
{
struct index_entry *ent = (struct index_entry *)dbe;
struct index_entry *ent = INDEX_ENTRY(dbe);
set_deinit(&ent->ie_set);
delete (struct index_entry *)dbe;
delete ent;
}
static gchar *index_key(struct db_entry *dbe)
{
struct index_entry *ent = (struct index_entry *)dbe;
return g_strdup(ent->ie_key.c_str());
return INDEX_ENTRY(dbe)->ie_key;
}
static void index_write(struct file *file, struct db_entry *dbe)
{
struct index_entry *ent = (struct index_entry *)dbe;
file_writef(file, "%s\n" , ent->ie_key.c_str());
set_write(file, &ent->ie_set);
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)
{
struct index_entry *ent = new index_entry;
gchar *key = file_readl(file);
struct index_entry *ent;
ent->ie_key = key;
g_free(key);
ent = __index_alloc(key);
set_read(file, &ent->ie_set);
return ent;
return &ent->ie_dbe;
}

View File

@ -16,14 +16,13 @@ extern "C" {
* The index_entry struct is used to associate a specific key with a set of
* integer identifiers. This lets us use a Database as an inverted index.
*/
struct index_entry : public db_entry {
std::string ie_key;
struct set ie_set;
index_entry(); /**< Create an empty IndexEntry. */
struct index_entry {
gchar *ie_key;
struct set ie_set;
struct db_entry ie_dbe;
};
#define INDEX_ENTRY(dbe) ((struct index_entry *)dbe)
#define INDEX_ENTRY(dbe) ((struct index_entry *)DBE_DATA(dbe))
/* Initialize a database for use as an index. */

View File

@ -14,8 +14,8 @@ static void test_entry()
unsigned int i;
struct file f;
ie = (index_entry *)index_ops->dbe_alloc("Link");
test_str_equal(index_ops->dbe_key(ie), "Link");
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);
@ -29,18 +29,21 @@ static void test_entry()
file_init(&f, "index_entry", 0);
file_open(&f, OPEN_WRITE);
file_writef(&f, "Zelda\n0 \n");
index_ops->dbe_write(&f, ie);
index_ops->dbe_write(&f, &ie->ie_dbe);
file_close(&f);
index_ops->dbe_free(ie);
g_free(ie->ie_key);
index_ops->dbe_free(&ie->ie_dbe);
file_open(&f, OPEN_READ);
ie = (struct index_entry *)index_ops->dbe_read(&f);
test_str_equal(index_ops->dbe_key(ie), "Zelda");
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);
index_ops->dbe_free(ie);
g_free(ie->ie_key);
index_ops->dbe_free(&ie->ie_dbe);
ie = (struct index_entry *)index_ops->dbe_read(&f);
test_str_equal(index_ops->dbe_key(ie), "Link");
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);
@ -50,7 +53,8 @@ static void test_entry()
i++;
} test_loop_passed();
index_ops->dbe_free(ie);
g_free(ie->ie_key);
index_ops->dbe_free(&ie->ie_dbe);
}
static void test_stress(unsigned int N)
@ -58,20 +62,20 @@ static void test_stress(unsigned int N)
const struct db_ops *index_ops = test_index_ops();
struct database index;
index_entry *ie, *ie2;
std::string key;
unsigned int i;
gchar key[2] = "";
char c;
index_init(&index, "stress.idx", false);
/* index_insert() */
for (c = 'a'; c <= 'z'; c++) {
key = c;
ie = index_insert(&index, key.c_str(), 0);
g_strlcpy(key, &c, 2);
ie = index_insert(&index, key, 0);
test_loop_not_equal(ie, NULL, c - 'a');
test_loop_str_equal(index_ops->dbe_key(ie), key, 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.c_str(), i);
ie2 = index_insert(&index, key, i);
test_loop_equal(ie, 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');
@ -80,18 +84,18 @@ static void test_stress(unsigned int N)
/* index_has() */
for (c = 'a'; c <= 'z'; c += 4) {
key = c;
g_strlcpy(key, &c, 2);
for (i = 0; i < N; i++)
test_loop_equal(index_has(&index, key.c_str(), i), true, i);
test_loop_equal(index_has(&index, key.c_str(), N), false, c - 'a');
test_loop_equal(index_has(&index, key, i), true, i);
test_loop_equal(index_has(&index, key, N), false, c - 'a');
} test_loop_passed();
/* index_remove() */
for (c = 'a'; c <= 'z'; c += 4) {
key = c;
g_strlcpy(key, &c, 2);
for (i = 0; i < N; i++)
index_remove(&index, key.c_str(), i);
ie = INDEX_ENTRY(db_find(&index, key.c_str()));
index_remove(&index, key, i);
ie = INDEX_ENTRY(db_find(&index, key));
test_loop_not_equal(ie, NULL, c - 'a');
test_loop_equal(set_size(&ie->ie_set), 0, c - 'a');
} test_loop_passed();