X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=antikythera;a=blobdiff_plain;f=src%2Fdataset.inl;fp=src%2Fdataset.inl;h=5f0fbf96e266deb09cd242455734204e157ad25a;hp=0000000000000000000000000000000000000000;hb=ccc1a688b59e25bb934a0d3e2bbf477960068d4f;hpb=080d7a779d43f549fc16c44e709cbf5989180fdf diff --git a/src/dataset.inl b/src/dataset.inl new file mode 100644 index 0000000..5f0fbf9 --- /dev/null +++ b/src/dataset.inl @@ -0,0 +1,96 @@ +#include +#include + +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(); + 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(!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) { + fprintf(stderr, "failed to load resource %d (%s)\n", id, resman_get_res_name(dset->rman, id)); + } else { + printf("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); + } +}