2014-10-17 10:37:13 -04:00
|
|
|
/**
|
2014-03-12 20:23:34 -04:00
|
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
|
|
*/
|
2014-06-05 10:19:22 -04:00
|
|
|
#include <core/index.h>
|
2014-03-12 20:23:34 -04:00
|
|
|
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
index_entry :: index_entry() {}
|
|
|
|
index_entry :: index_entry(const std::string &key)
|
|
|
|
: ie_key(key)
|
2014-03-12 20:23:34 -04:00
|
|
|
{}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
const std::string index_entry :: primary_key() const
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-10-21 10:41:42 -04:00
|
|
|
return ie_key;
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
void index_entry :: remove(unsigned int value)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-10-21 10:41:42 -04:00
|
|
|
ie_set.erase(value);
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
size_t index_entry :: size()
|
2014-11-06 08:24:13 -05:00
|
|
|
{
|
2015-10-21 10:41:42 -04:00
|
|
|
return ie_set.size();
|
2014-11-06 08:24:13 -05:00
|
|
|
}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
bool index_entry :: has(unsigned int value)
|
2014-11-06 08:24:13 -05:00
|
|
|
{
|
2015-10-21 10:41:42 -04:00
|
|
|
return ie_set.find(value) != ie_set.end();
|
2014-11-06 08:24:13 -05:00
|
|
|
}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
typename index_entry::iterator index_entry :: begin()
|
2014-11-06 08:24:13 -05:00
|
|
|
{
|
2015-10-21 10:41:42 -04:00
|
|
|
return ie_set.begin();
|
2014-11-06 08:24:13 -05:00
|
|
|
}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
typename index_entry::iterator index_entry :: end()
|
2014-11-06 08:24:13 -05:00
|
|
|
{
|
2015-10-21 10:41:42 -04:00
|
|
|
return ie_set.end();
|
2014-11-06 08:24:13 -05:00
|
|
|
}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
void index_entry :: write(file &file)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
|
|
|
std::set<unsigned int>::iterator it;
|
2015-10-21 10:41:42 -04:00
|
|
|
file_writef(&file, "%s\n%zu ", ie_key.c_str(), ie_set.size());
|
|
|
|
for (it = ie_set.begin(); it != ie_set.end(); it++)
|
2015-10-08 09:41:51 -04:00
|
|
|
file_writef(&file, "%u ", *it);
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
|
2015-10-21 10:41:42 -04:00
|
|
|
void index_entry :: read(file &file)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
|
|
|
unsigned int num, val;
|
2015-10-09 13:09:47 -04:00
|
|
|
gchar *key = file_readl(&file);
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-10-21 10:21:43 -04:00
|
|
|
file_readf(&file, "%u ", &num);
|
2015-10-21 10:41:42 -04:00
|
|
|
ie_key = key;
|
2015-10-09 13:09:47 -04:00
|
|
|
g_free(key);
|
2015-10-08 11:16:38 -04:00
|
|
|
|
2014-03-12 20:23:34 -04:00
|
|
|
for (unsigned int i = 0; i < num; i++) {
|
2015-10-08 11:16:38 -04:00
|
|
|
file_readf(&file, "%u", &val);
|
2015-09-29 16:11:59 -04:00
|
|
|
ie_set.insert(val);
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Index :: Index(const std::string &filepath, bool autosave)
|
2015-09-21 09:02:13 -04:00
|
|
|
{
|
|
|
|
db_init(this, filepath.c_str(), autosave);
|
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-09-29 16:11:59 -04:00
|
|
|
index_entry *index_insert(Index *index, const gchar *key, unsigned int value)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-09-29 16:11:59 -04:00
|
|
|
index_entry *it = db_find(index, key);
|
|
|
|
|
|
|
|
it->ie_set.insert(value);
|
|
|
|
db_autosave(index);
|
|
|
|
return it;
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
|
2014-11-07 08:12:55 -05:00
|
|
|
void Index :: remove(const std::string &key, unsigned int value)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-10-21 10:41:42 -04:00
|
|
|
index_entry *it = db_get(this, key.c_str());
|
2015-10-20 10:10:26 -04:00
|
|
|
if (it) {
|
|
|
|
it->remove(value);
|
|
|
|
::db_autosave(this);
|
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|