]> git.tdb.fi Git - libs/core.git/blob - source/core/application.h
Drop copyright and license notices from source files
[libs/core.git] / source / core / application.h
1 #ifndef MSP_CORE_APPLICATION_H_
2 #define MSP_CORE_APPLICATION_H_
3
4 namespace Msp {
5
6 /**
7 Base class for applications.  Inherit the main class from this and add a static
8 member of type RegApp<MainClass>.
9 */
10 class Application
11 {
12 protected:
13         class Starter
14         {
15         protected:
16                 Starter();
17         public:
18                 virtual ~Starter() { }
19
20                 virtual Application *create_app(int, char **) = 0;
21         };
22
23         bool done;
24         int exit_code;
25
26 private:
27         static Starter *starter_;
28         static Application *app_;
29         static void *data_;
30
31         Application(const Application &);
32         Application &operator=(const Application &);
33 protected:
34         Application();
35 public:
36         virtual ~Application() { }
37
38         static int run(int, char **, void * =0);
39         static void *get_data() { return data_; }
40
41 protected:
42         virtual int main();
43         void catch_signal(int);
44         void exit(int);
45         virtual void tick() { }
46         virtual void sighandler(int) { }
47 private:
48         static void sighandler_(int);
49 };
50
51
52 template<typename T>
53 class RegisteredApplication: public Application
54 {
55 private:
56         class Starter: public Application::Starter
57         {
58         public:
59                 Application *create_app(int argc, char **argv) { return new T(argc, argv); }
60         };
61
62         static Starter starter_;
63
64 protected:
65         // Force the starter into existence
66         RegisteredApplication() { (void)starter_; }
67 };
68
69 template<typename T>
70 typename RegisteredApplication<T>::Starter RegisteredApplication<T>::starter_;
71
72 } // namespace Msp
73
74 #endif