ocarina/include/database.h

105 lines
1.9 KiB
C
Raw Normal View History

/*
* Copyright 2013 (c) Anna Schumaker.
*/
#ifndef OCARINA_DATABASE_H
#define OCARINA_DATABASE_H
#include <file.h>
#include <print.h>
#include <map>
#include <set>
#include <vector>
template <class T>
class DatabaseEntry {
public:
bool valid;
DatabaseEntry();
virtual T &primary_key() = 0;
virtual void write(File &) = 0;
virtual void read(File &) = 0;
#ifdef CONFIG_DEBUG
virtual void print() = 0;
#endif /* CONFIG_DEBUG */
};
class IndexEntry : public DatabaseEntry<const std::string> {
public:
std::string key;
std::set<unsigned int> values;
IndexEntry();
IndexEntry(const std::string &, unsigned int);
~IndexEntry();
const std::string &primary_key();
void write(File &);
void read(File &);
void print();
void insert(unsigned int);
void remove(unsigned int);
};
template <class T, class U>
class Database {
private:
std::vector<T> db;
std::map<U, unsigned int> keys;
unsigned int _size;
File file;
public:
Database(std::string);
~Database();
void save();
void load();
#ifdef CONFIG_DEBUG
void clear();
void print();
void print_keys();
#endif /* CONFIG_DEBUG */
unsigned int insert(T);
void remove(unsigned int);
unsigned int size();
unsigned int num_rows();
unsigned int first();
unsigned int last();
unsigned int next(unsigned int);
unsigned int find_index(const std::string &);
T &find(const std::string &);
T &operator[](unsigned int);
};
template <class T>
static inline void index_insert(Database<IndexEntry, T> &db,
const std::string &key,
unsigned int val)
{
try {
db.find(key).insert(val);
} catch (...) {
db.insert(IndexEntry(key, val));
}
}
template <class T>
static inline void index_remove(Database<IndexEntry, T> &db,
const std::string &key,
unsigned int val)
{
unsigned int i = db.find_index(key);
db[i].remove(val);
if (db[i].values.size() == 0)
db.remove(db.find_index(key));
}
#include "database.hpp"
#endif /* OCARINA_DATABASE_H */