nuclear@48: #ifndef DATASET_H_ nuclear@48: #define DATASET_H_ nuclear@48: nuclear@48: #include nuclear@48: #include nuclear@48: #include nuclear@48: #include nuclear@48: #include "datapath.h" nuclear@48: nuclear@48: template nuclear@48: class DataSet { nuclear@48: private: nuclear@48: mutable std::map data; nuclear@48: nuclear@48: std::function load; nuclear@48: std::function destroy; nuclear@48: nuclear@48: public: nuclear@48: DataSet(std::function load_func, std::function destr_func); nuclear@48: ~DataSet(); nuclear@48: nuclear@48: T get(const char *name) const; nuclear@48: }; nuclear@48: nuclear@48: template nuclear@48: DataSet::DataSet(std::function load_func, std::function destr_func) nuclear@48: { nuclear@48: load = load_func; nuclear@48: destroy = destr_func; nuclear@48: } nuclear@48: nuclear@48: template nuclear@48: DataSet::~DataSet() nuclear@48: { nuclear@48: if(destroy) { nuclear@48: for(auto it : data) { nuclear@48: destroy(it.second); nuclear@48: } nuclear@48: } nuclear@48: } nuclear@48: nuclear@48: template nuclear@48: T DataSet::get(const char *name) const nuclear@48: { nuclear@48: auto iter = data.find(name); nuclear@48: if(iter != data.end()) { nuclear@48: return iter->second; nuclear@48: } nuclear@48: nuclear@48: const char *path, *slash; nuclear@48: if((slash = strrchr(name, '/'))) { nuclear@48: path = slash + 1; nuclear@48: } else { nuclear@48: path = name; nuclear@48: } nuclear@48: if(!(path = datafile_path(path))) { nuclear@48: fprintf(stderr, "can't find data file: %s\n", name); nuclear@48: return 0; nuclear@48: } nuclear@48: nuclear@48: T res = load(path); nuclear@48: if(res) { nuclear@48: data[name] = res; nuclear@48: } nuclear@48: return res; nuclear@48: } nuclear@48: nuclear@48: #endif // DATASET_H_