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