ocarina/core/index.cpp

89 lines
1.6 KiB
C++

/**
* Copyright 2014 (c) Anna Schumaker.
*/
#include <core/index.h>
index_entry :: index_entry() {}
index_entry :: index_entry(const std::string &key)
: ie_key(key)
{}
const std::string index_entry :: primary_key() const
{
return ie_key;
}
void index_entry :: remove(unsigned int value)
{
ie_set.erase(value);
}
size_t index_entry :: size()
{
return ie_set.size();
}
bool index_entry :: has(unsigned int value)
{
return ie_set.find(value) != ie_set.end();
}
typename index_entry::iterator index_entry :: begin()
{
return ie_set.begin();
}
typename index_entry::iterator index_entry :: end()
{
return ie_set.end();
}
void index_entry :: write(file &file)
{
std::set<unsigned int>::iterator it;
file_writef(&file, "%s\n%zu ", ie_key.c_str(), ie_set.size());
for (it = ie_set.begin(); it != ie_set.end(); it++)
file_writef(&file, "%u ", *it);
}
void index_entry :: read(file &file)
{
unsigned int num, val;
gchar *key = file_readl(&file);
file_readf(&file, "%u ", &num);
ie_key = key;
g_free(key);
for (unsigned int i = 0; i < num; i++) {
file_readf(&file, "%u", &val);
ie_set.insert(val);
}
}
Index :: Index(const std::string &filepath, bool autosave)
{
db_init(this, filepath.c_str(), autosave);
}
index_entry *index_insert(Index *index, const gchar *key, unsigned int value)
{
index_entry *it = db_find(index, key);
it->ie_set.insert(value);
db_autosave(index);
return it;
}
void Index :: remove(const std::string &key, unsigned int value)
{
index_entry *it = db_get(this, key.c_str());
if (it) {
it->remove(value);
::db_autosave(this);
}
}