nuclear@13: #include nuclear@13: #include nuclear@13: nuclear@13: template nuclear@13: DataSet::DataSet(T (*load_func)(const char*), void (*destr_func)(T)) nuclear@13: { nuclear@13: load = load_func; nuclear@13: destroy = destr_func; nuclear@13: } nuclear@13: nuclear@13: template nuclear@13: DataSet::~DataSet() nuclear@13: { nuclear@13: clear(); nuclear@13: } nuclear@13: nuclear@13: template nuclear@13: void DataSet::clear() nuclear@13: { nuclear@13: if(destroy) { nuclear@13: typename std::map::iterator it = data.begin(); nuclear@13: while(it != data.end()) { nuclear@13: destroy(it++->second); nuclear@13: } nuclear@13: } nuclear@13: data.clear(); nuclear@13: } nuclear@13: nuclear@13: template nuclear@13: T DataSet::get(const char *name) const nuclear@13: { nuclear@13: typename std::map::const_iterator iter = data.find(name); nuclear@13: if(iter != data.end()) { nuclear@13: return iter->second; nuclear@13: } nuclear@13: nuclear@13: const char *fname, *slash; nuclear@13: if((slash = strrchr(name, '/'))) { nuclear@13: fname = slash + 1; nuclear@13: } else { nuclear@13: fname = name; nuclear@13: } nuclear@13: nuclear@13: std::string path = fname; nuclear@13: if(path.empty()) { nuclear@13: fprintf(stderr, "can't find data file: %s\n", name); nuclear@13: return 0; nuclear@13: } nuclear@13: nuclear@13: T res = load(path.c_str()); nuclear@13: if(res) { nuclear@13: data[name] = res; nuclear@13: } nuclear@13: return res; nuclear@13: }