adding mirror plane options other than auto
[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(long timeslice)
36 {
37         resman_setopt(rman, RESMAN_OPT_TIMESLICE, timeslice);
38         resman_poll(rman);
39 }
40
41 template <typename T>
42 T DataSet<T>::get(const char *name) const
43 {
44         typename std::map<std::string, T>::const_iterator iter = data.find(name);
45         if(iter != data.end()) {
46                 return iter->second;
47         }
48
49         T res = create();
50         data[name] = res;
51         resman_add(rman, name, res);
52         return res;
53 }
54
55 template <typename T>
56 int DataSet<T>::pending() const
57 {
58         return resman_pending(rman);
59 }
60
61 template <typename T>
62 void DataSet<T>::wait() const
63 {
64         resman_waitall(rman);
65 }
66
67 template <typename T>
68 void DataSet<T>::add_loaded_callback(LoadedCallbackFunc func, void *cls)
69 {
70         std::pair<LoadedCallbackFunc, void*> cb;
71         cb.first = func;
72         cb.second = cls;
73         loaded_cb.push_back(cb);
74 }
75
76 template <typename T>
77 bool DataSet<T>::remove_loaded_callback(LoadedCallbackFunc func)
78 {
79         int numcb = (int)loaded_cb.size();
80         for(int i=0; i<numcb; i++) {
81                 if(loaded_cb[i].first == func) {
82                         loaded_cb.erase(loaded_cb.begin() + i);
83                         return true;
84                 }
85         }
86         return false;
87 }
88
89
90 // --- static functions to pass as callback to resman ---
91
92 template <typename T>
93 int DataSet<T>::dataset_load_func(const char *fname, int id, void *cls)
94 {
95         DataSet<T> *dset = (DataSet<T>*)cls;
96         T data = (T)resman_get_res_data(dset->rman, id);
97         if(!data) return -1;
98
99         if(!dset->load(data, fname)) {
100                 return -1;
101         }
102         return 0;
103 }
104
105 template <typename T>
106 int DataSet<T>::dataset_done_func(int id, void *cls)
107 {
108         DataSet<T> *dset = (DataSet<T>*)cls;
109
110         T data = (T)resman_get_res_data(dset->rman, id);
111         int load_res = resman_get_res_result(dset->rman, id);
112
113         if(load_res != 0) {
114                 error_log("failed to load resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
115         } else {
116                 info_log("done loading resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
117         }
118
119         if(dset->done) {
120                 dset->done(data);
121         }
122
123         int numcb = (int)dset->loaded_cb.size();
124         for(int i=0; i<numcb; i++) {
125                 dset->loaded_cb[i].first(data, dset->loaded_cb[i].second);
126         }
127         return 0;
128 }
129
130 template <typename T>
131 void DataSet<T>::dataset_destroy_func(int id, void *cls)
132 {
133         DataSet<T> *dset = (DataSet<T>*)cls;
134         T data = (T)resman_get_res_data(dset->rman, id);
135
136         if(dset->destroy) {
137                 dset->destroy(data);
138         }
139 }