]> git.tdb.fi Git - libs/core.git/blob - source/core/application.h
af18cea664b35eca77cc2148fd4db6815f5fadb6
[libs/core.git] / source / core / application.h
1 #ifndef MSP_CORE_APPLICATION_H_
2 #define MSP_CORE_APPLICATION_H_
3
4 #include <stdexcept>
5
6 namespace Msp {
7
8 /**
9 Base class for applications.  See also RegisteredApplication.
10 */
11 class Application
12 {
13 protected:
14         class Starter
15         {
16         protected:
17                 Starter();
18         public:
19                 virtual ~Starter() { }
20
21                 virtual Application *create_app(int, char **) = 0;
22         };
23
24         bool done;
25         int exit_code;
26
27 private:
28         static Starter *starter_;
29         static Application *app_;
30         static void *data_;
31
32         Application(const Application &);
33         Application &operator=(const Application &);
34 protected:
35         Application();
36 public:
37         virtual ~Application() { }
38
39         /** Constructs an instance of the registered application class and runs it.
40         If the application throws a usage_error, a help message is printed.  The
41         GetOpt class will throw such exceptions automatically in error conditions.
42
43         This function can only be called once.  The global main() function provided
44         by the library normally does it automatically at program startup. */
45         static int run(int, char **, void * =0, void (*)(void *) = 0);
46
47         static void *get_data() { return data_; }
48
49 protected:
50         /** Default main loop.  Calls tick() repeatedly until exit() is called.  A
51         custom main loop should monitor the done member variable and return
52         exit_code. */
53         virtual int main();
54
55         /** Sets the specified signal to be delivered to the sighandler member
56         function. */
57         void catch_signal(int);
58
59         /** Causes the application to exit gracefully with the given exit code. */
60         void exit(int);
61
62         virtual void tick() { }
63         virtual void sighandler(int) { }
64
65 private:
66         /** Static wrapper function to call a member function of the Application
67         instance. */
68         static void sighandler_(int);
69 };
70
71
72 /**
73 Registers the class to be used for program startup.  The main application class
74 should be derived from this.
75 */
76 template<typename T>
77 class RegisteredApplication: public Application
78 {
79 private:
80         class Starter: public Application::Starter
81         {
82         public:
83                 Application *create_app(int argc, char **argv) { return new T(argc, argv); }
84         };
85
86         static Starter starter_;
87
88 protected:
89         // Force the starter into existence
90         RegisteredApplication() { (void)starter_; }
91 };
92
93 template<typename T>
94 typename RegisteredApplication<T>::Starter RegisteredApplication<T>::starter_;
95
96 } // namespace Msp
97
98 #endif