goat3dgfx

diff src/dataset.inl @ 0:1873dfd13f2d

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 14 Nov 2013 05:27:09 +0200
parents
children 18879c956eb1
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/dataset.inl	Thu Nov 14 05:27:09 2013 +0200
     1.3 @@ -0,0 +1,56 @@
     1.4 +#include <stdio.h>
     1.5 +#include <string.h>
     1.6 +#include "datapath.h"
     1.7 +
     1.8 +template <typename T>
     1.9 +DataSet<T>::DataSet(T (*load_func)(const char*), void (*destr_func)(T))
    1.10 +{
    1.11 +	load = load_func;
    1.12 +	destroy = destr_func;
    1.13 +}
    1.14 +
    1.15 +template <typename T>
    1.16 +DataSet<T>::~DataSet()
    1.17 +{
    1.18 +	clear();
    1.19 +}
    1.20 +
    1.21 +template <typename T>
    1.22 +void DataSet<T>::clear()
    1.23 +{
    1.24 +	if(destroy) {
    1.25 +		typename std::map<std::string, T>::iterator it = data.begin();
    1.26 +		while(it != data.end()) {
    1.27 +			destroy(it++->second);
    1.28 +		}
    1.29 +	}
    1.30 +	data.clear();
    1.31 +}
    1.32 +
    1.33 +template <typename T>
    1.34 +T DataSet<T>::get(const char *name) const
    1.35 +{
    1.36 +	typename std::map<std::string, T>::const_iterator iter = data.find(name);
    1.37 +	if(iter != data.end()) {
    1.38 +		return iter->second;
    1.39 +	}
    1.40 +
    1.41 +	const char *fname, *slash;
    1.42 +	if((slash = strrchr(name, '/'))) {
    1.43 +		fname = slash + 1;
    1.44 +	} else {
    1.45 +		fname = name;
    1.46 +	}
    1.47 +
    1.48 +	std::string path = datafile_path(fname);
    1.49 +	if(path.empty()) {
    1.50 +		fprintf(stderr, "can't find data file: %s\n", name);
    1.51 +		return 0;
    1.52 +	}
    1.53 +
    1.54 +	T res = load(path.c_str());
    1.55 +	if(res) {
    1.56 +		data[name] = res;
    1.57 +	}
    1.58 +	return res;
    1.59 +}