added func_coaxial
[antikythera] / src / dataset.inl
1 #include <stdio.h>
2 #include <string.h>
3
4 template <typename T>
5 DataSet<T>::DataSet(T (*create_func)(), bool (*load_func)(T, const char*), bool (*done_func)(T), void (*destr_func)(T))
6 {
7         create = create_func;
8         load = load_func;
9         done = done_func;
10         destroy = destr_func;
11
12         rman = resman_create();
13         resman_set_load_func(rman, dataset_load_func, this);
14         resman_set_done_func(rman, dataset_done_func, this);
15         resman_set_destroy_func(rman, dataset_destroy_func, this);
16 }
17
18 template <typename T>
19 DataSet<T>::~DataSet()
20 {
21         resman_free(rman);
22 }
23
24 template <typename T>
25 void DataSet<T>::clear()
26 {
27         resman_free(rman);
28         data.clear();
29
30         rman = resman_create();
31 }
32
33 template <typename T>
34 void DataSet<T>::update()
35 {
36         resman_poll(rman);
37 }
38
39 template <typename T>
40 T DataSet<T>::get(const char *name) const
41 {
42         typename std::map<std::string, T>::const_iterator iter = data.find(name);
43         if(iter != data.end()) {
44                 return iter->second;
45         }
46
47         T res = create();
48         resman_lookup(rman, name, res);
49         return res;
50 }
51
52
53 // --- static functions to pass as callback to resman ---
54
55 template <typename T>
56 int DataSet<T>::dataset_load_func(const char *fname, int id, void *cls)
57 {
58         DataSet<T> *dset = (DataSet<T>*)cls;
59         T data = (T)resman_get_res_data(dset->rman, id);
60
61         if(!dset->load(data, fname)) {
62                 return -1;
63         }
64         return 0;
65 }
66
67 template <typename T>
68 int DataSet<T>::dataset_done_func(int id, void *cls)
69 {
70         DataSet<T> *dset = (DataSet<T>*)cls;
71
72         T data = (T)resman_get_res_data(dset->rman, id);
73         int load_res = resman_get_res_result(dset->rman, id);
74
75         if(load_res != 0) {
76                 fprintf(stderr, "failed to load resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
77         } else {
78                 printf("done loading resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
79         }
80
81         if(dset->done) {
82                 dset->done(data);
83         }
84         return 0;
85 }
86
87 template <typename T>
88 void DataSet<T>::dataset_destroy_func(int id, void *cls)
89 {
90         DataSet<T> *dset = (DataSet<T>*)cls;
91         T data = (T)resman_get_res_data(dset->rman, id);
92
93         if(dset->destroy) {
94                 dset->destroy(data);
95         }
96 }