#include #include #include "logger.h" template DataSet::DataSet(T (*create_func)(), bool (*load_func)(T, const char*), bool (*done_func)(T), void (*destr_func)(T)) { create = create_func; load = load_func; done = done_func; destroy = destr_func; rman = resman_create(); resman_set_load_func(rman, dataset_load_func, this); resman_set_done_func(rman, dataset_done_func, this); resman_set_destroy_func(rman, dataset_destroy_func, this); } template DataSet::~DataSet() { resman_free(rman); } template void DataSet::clear() { resman_free(rman); data.clear(); rman = resman_create(); } template void DataSet::update() { resman_poll(rman); } template T DataSet::get(const char *name) const { typename std::map::const_iterator iter = data.find(name); if(iter != data.end()) { return iter->second; } T res = create(); data[name] = res; resman_lookup(rman, name, res); return res; } // --- static functions to pass as callback to resman --- template int DataSet::dataset_load_func(const char *fname, int id, void *cls) { DataSet *dset = (DataSet*)cls; T data = (T)resman_get_res_data(dset->rman, id); if(!data) return -1; if(!dset->load(data, fname)) { return -1; } return 0; } template int DataSet::dataset_done_func(int id, void *cls) { DataSet *dset = (DataSet*)cls; T data = (T)resman_get_res_data(dset->rman, id); int load_res = resman_get_res_result(dset->rman, id); if(load_res != 0) { error_log("failed to load resource %d (%s)\n", id, resman_get_res_name(dset->rman, id)); } else { info_log("done loading resource %d (%s)\n", id, resman_get_res_name(dset->rman, id)); } if(dset->done) { dset->done(data); } return 0; } template void DataSet::dataset_destroy_func(int id, void *cls) { DataSet *dset = (DataSet*)cls; T data = (T)resman_get_res_data(dset->rman, id); if(dset->destroy) { dset->destroy(data); } }