diff --git a/core/index.cpp b/core/index.cpp index 93b75044..4fbb9a8b 100644 --- a/core/index.cpp +++ b/core/index.cpp @@ -4,48 +4,46 @@ #include -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; } diff --git a/include/core/index.h b/include/core/index.h index 5d1a697b..8ab48b9a 100644 --- a/include/core/index.h +++ b/include/core/index.h @@ -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. */ diff --git a/tests/core/index.cpp b/tests/core/index.cpp index 7e057a13..b576ee75 100644 --- a/tests/core/index.cpp +++ b/tests/core/index.cpp @@ -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();