Save bitmaps as PNG
[lsnes.git] / include / library / register-queue.hpp
blob78cc0ac225bfb109f8ffd8afd95724db5e845f29
1 #ifndef _library__register_queue__hpp__included__
2 #define _library__register_queue__hpp__included__
4 #include "threadtypes.hpp"
5 #include <string>
6 #include <list>
7 #include <set>
9 /**
10 * Object registration queue.
12 template<class G, class O>
13 class register_queue
15 public:
16 /**
17 * Register an object.
19 * Parameter group: The group to register to.
20 * Parameter name: The name for object.
21 * Parameter object: The object to register.
23 static void do_register(G& group, const std::string& name, O& object)
26 umutex_class h(get_mutex());
27 if(get_ready().count(&group)) {
28 group.do_register(name, object);
29 return;
31 queue_entry<G, O> ent;
32 ent.group = &group;
33 ent.name = name;
34 ent.object = &object;
35 get_pending().push_back(ent);
37 run();
39 /**
40 * Unregister an object.
42 * Parameter group: The group to unregister from.
43 * Parameter name: The name for object.
45 static void do_unregister(G& group, const std::string& name)
47 umutex_class h(get_mutex());
48 auto& x = get_pending();
49 auto i = x.begin();
50 while(i != x.end()) {
51 auto e = i++;
52 if(&group == e->group && name == e->name)
53 x.erase(e);
55 if(get_ready().count(&group))
56 group.do_unregister(name);
58 /**
59 * Mark group ready/not ready.
61 * Parameter group: The group.
62 * Parameter ready: True if ready, false if not.
64 static void do_ready(G& group, bool ready)
67 umutex_class h(get_mutex());
68 if(ready)
69 get_ready().insert(&group);
70 else
71 get_ready().erase(&group);
73 run();
75 private:
76 template<class G2, class O2>
77 struct queue_entry
79 G2* group;
80 std::string name;
81 O2* object;
83 static std::set<G*>& get_ready()
85 static std::set<G*> x;
86 return x;
88 static std::list<queue_entry<G, O>>& get_pending()
90 static std::list<queue_entry<G, O>> x;
91 return x;
93 static mutex_class& get_mutex()
95 static mutex_class x;
96 return x;
98 static void run()
100 umutex_class h(get_mutex());
101 auto& x = get_pending();
102 auto i = x.begin();
103 while(i != x.end()) {
104 auto e = i++;
105 if(get_ready().count(e->group)) {
106 e->group->do_register(e->name, *e->object);
107 x.erase(e);
113 #endif