Fix memory leaks, fix tests.
[command.git] / include / command.h
1 #ifndef __COMMAND_COMMAND_H
2 #define __COMMAND_COMMAND_H
3
4 #include <string>
5 #include <vector>
6
7 #include "parameter.h"
8
9 namespace command {
10     /**
11      * Main class for handling user passed parameters from command line.
12      */
13     class Command {
14     protected:
15         std::vector<Parameter *> parameters;
16     public:
17         /**
18          * Default constructor.
19          *
20          * @param argc passed to the main function
21          * @param argv passed to the main function
22          * @param params initializer_list containing Parameter handlers
23          *      responsible for correctly handle user data.
24          */
25         Command(unsigned int argc, char *argv[], std::initializer_list<Parameter *> params)
26             : parameters(params) {
27
28             try {
29                 matchArguments(argc, argv);
30             }
31             catch(std::invalid_argument exception) {
32                 releaseMemory();
33                 throw;
34             }
35         }
36
37         /**
38          * Destructor. Releases allocated memory.
39          */
40         ~Command() {
41             releaseMemory();
42         }
43     protected:
44         /**
45          * Matches user passed arguments with available parameter handlers.
46          */
47         void matchArguments(unsigned int argc, char *argv[]) {
48             for (unsigned int i = 1; i < argc; i++) {
49                 for(Parameter *param : parameters) {
50                     if (param->understand(argv[i])) {
51                         param->handle();
52                         break;
53                     }
54                 }
55             }
56         }
57
58         /**
59          * Releases acquired memory
60          */
61         void releaseMemory() {
62             for (Parameter * parameter : parameters) {
63                 if (parameter != NULL) {
64                     delete parameter;
65                 }
66             }
67             parameters.clear();
68             parameters.shrink_to_fit();
69         }
70     };
71 }
72
73 #endif /* __COMMAND_COMMAND_H */