/* * Copyright 2013 (c) Anna Schumaker. * * DO NOT INCLUDE THIS FILE DIRECTLY. THIS IS A TEMPLATE DEFINITION FILE * AND ONLY MEANT TO BE INCLUDED BY include/database.h! */ #ifndef OCARINA_DATABASE_HPP #define OCARINA_DATABASE_HPP template Database :: Database(std::string filepath, DatabaseFlags f) : _size(0), file(filepath, FILE_TYPE_DATA), flags(f) { } template Database :: ~Database() { } template void Database :: save() { if (file.open(OPEN_WRITE) == false) return; file << db.size() << std::endl; for (unsigned int i = 0; i < db.size(); i++) { file << db[i].valid << " "; if (db[i].valid == true) db[i].write(file); file << std::endl; } file.close(); } template void Database :: load() { unsigned int db_size; if (file.open(OPEN_READ) == false) return; file >> db_size; db.resize(db_size); for (unsigned int i = 0; i < db_size; i++) { file >> db[i].valid; if (db[i].valid == true) { db[i].read(file); _size++; } } file.close(); } #ifdef CONFIG_DEBUG template void Database :: clear() { db.clear(); _size = 0; } template void Database :: print() { :: print("Allocated rows: %u\n", db.size()); :: print("Valid rows: %u\n", _size); for (unsigned int i = 0; i < db.size(); i++) { if (db[i].valid == true) { :: print("db[%u] = ", i); db[i].print(); :: print("\n"); } } } #endif /* CONFIG_DEBUG */ template unsigned int Database :: insert(T val) { if (flags == DB_UNIQUE) { for (unsigned int i = first(); i < size(); i = next(i)) { if (val == db[i]) return i; } } db.push_back(val); db[_size].valid = true; _size++; return db.size() - 1; } template void Database :: remove(unsigned int id) { db[id].valid = false; _size--; } template unsigned int Database :: size() { return _size; } template unsigned int Database :: num_rows() { return db.size(); } template unsigned int Database :: first() { for (unsigned int i = 0; i < db.size(); i++) { if (db[i].valid == true) return i; } return db.size(); } template unsigned int Database :: last() { if (_size == 0) return db.size(); for (unsigned int i = db.size() - 1; i >= 0; i--) { if (db[i].valid == true) return i; } return db.size(); } template unsigned int Database :: next(unsigned int id) { for (unsigned int i = id + 1; i < db.size(); i++) { if (db[i].valid == true) return i; } return db.size(); } template T &Database :: operator[](unsigned int id) { return db[id]; } #endif /* OCARINA_DATABASE_HPP */