Instancefy audioapi core (but not driver) stuff
[lsnes.git] / include / core / instance.hpp
blob93b9d2aa176f84bed6b5da10ebb1f6dc6940a8a8
1 #ifndef _instance__hpp__included__
2 #define _instance__hpp__included__
4 #include "library/threads.hpp"
6 class movie_logic;
7 class memory_space;
8 class memwatch_set;
9 class voice_commentary;
10 class subtitle_commentary;
11 class movie_branches;
12 class multitrack_edit;
13 class _lsnes_status;
14 class alias_binds_manager;
15 class rrdata;
16 class cart_mappings_refresher;
17 class controller_state;
18 class project_state;
19 class debug_context;
20 class framerate_regulator;
21 class emu_framebuffer;
22 class input_queue;
23 class master_dumper;
24 class button_mapping;
25 class emulator_dispatch;
26 class slotinfo_cache;
27 class lua_state;
28 class audioapi_instance;
29 namespace command { class group; }
30 namespace lua { class state; }
31 namespace settingvar { class group; }
32 namespace settingvar { class cache; }
33 namespace keyboard { class keyboard; }
34 namespace keyboard { class mapper; }
35 namespace triplebuffer { template<typename T> class triplebuffer; }
37 class dtor_list
39 struct entry
41 void* ptr;
42 void (*free1)(void* ptr);
43 void (*free2)(void* ptr);
44 entry* prev;
46 public:
47 dtor_list();
48 ~dtor_list();
49 void destroy();
50 template<typename T> void prealloc(T*& ptr)
52 entry e;
53 e.ptr = ptr = reinterpret_cast<T*>(new char[sizeof(T) + 32]);
54 memset(ptr, 0, sizeof(T) + 32);
55 e.free1 = null;
56 e.free2 = free2;
57 e.prev = list;
58 list = new entry(e);
60 template<typename T, typename... U> void init(T*& ptr, U&... args)
62 if(ptr) {
63 //Find the entry.
64 entry* e = list;
65 while(e->ptr != ptr)
66 e = e->prev;
67 new(ptr) T(args...);
68 e->free1 = free1_p<T>;
69 } else {
70 entry e;
71 e.ptr = ptr = new T(args...);
72 e.free1 = free1<T>;
73 e.free2 = null;
74 e.prev = list;
75 list = new entry(e);
78 private:
79 entry* list;
80 static void null(void* ptr) {}
81 static void free2(void* ptr) { delete[] reinterpret_cast<char*>(ptr); }
82 template<typename T> static void free1(void* ptr) { delete reinterpret_cast<T*>(ptr); }
83 template<typename T> static void free1_p(void* ptr) { reinterpret_cast<T*>(ptr)->~T(); }
86 struct emulator_instance
88 emulator_instance();
89 ~emulator_instance();
90 emulator_dispatch* dispatch;
91 movie_logic* mlogic;
92 memory_space* memory;
93 lua::state* lua;
94 lua_state* lua2;
95 memwatch_set* mwatch;
96 settingvar::group* settings;
97 settingvar::cache* setcache;
98 voice_commentary* commentary;
99 subtitle_commentary* subtitles;
100 movie_branches* mbranch;
101 controller_state* controls;
102 button_mapping* buttons;
103 multitrack_edit* mteditor;
104 _lsnes_status* status_A;
105 _lsnes_status* status_B;
106 _lsnes_status* status_C;
107 triplebuffer::triplebuffer<_lsnes_status>* status;
108 keyboard::keyboard* keyboard;
109 command::group* command;
110 keyboard::mapper* mapper;
111 alias_binds_manager* abindmanager;
112 rrdata* nrrdata;
113 cart_mappings_refresher* cmapper;
114 project_state* project;
115 debug_context* dbg;
116 framerate_regulator* framerate;
117 emu_framebuffer* fbuf;
118 input_queue* iqueue;
119 master_dumper* mdumper;
120 slotinfo_cache* slotcache;
121 audioapi_instance* audio;
122 threads::id emu_thread;
123 time_t random_seed_value;
124 dtor_list D;
125 private:
126 emulator_instance(const emulator_instance&);
127 emulator_instance& operator=(const emulator_instance&);
130 extern emulator_instance lsnes_instance;
132 emulator_instance& CORE();
134 #endif