Fix memory leaks, fix tests.
[command.git] / include / command.h
index 0c18cdf11727c404f0743f100326d1de27c234db..8ecb280e78aff6bb4080c40fd2ae086f65b44f12 100644 (file)
@@ -3,7 +3,6 @@
 
 #include <string>
 #include <vector>
-#include <iostream>
 
 #include "parameter.h"
 
@@ -26,33 +25,47 @@ namespace command {
         Command(unsigned int argc, char *argv[], std::initializer_list<Parameter *> params)
             : parameters(params) {
 
-            matchArguments(argc, argv);
-            invoke();
+            try {
+                matchArguments(argc, argv);
+            }
+            catch(std::invalid_argument exception) {
+                releaseMemory();
+                throw;
+            }
         }
 
         /**
          * Destructor. Releases allocated memory.
          */
         ~Command() {
-            for (Parameter * parameter : parameters) {
-                delete parameter;
-            }
+            releaseMemory();
         }
     protected:
         /**
          * Matches user passed arguments with available parameter handlers.
          */
-        void matchArguments(unsigned int , char **) {
-//             param->passUserValue();
+        void matchArguments(unsigned int argc, char *argv[]) {
+            for (unsigned int i = 1; i < argc; i++) {
+                for(Parameter *param : parameters) {
+                    if (param->understand(argv[i])) {
+                        param->handle();
+                        break;
+                    }
+                }
+            }
         }
 
         /**
-         * Invokes passed parameter handlers
+         * Releases acquired memory
          */
-        void invoke() {
-            for(Parameter *param : parameters) {
-                param->handle();
+        void releaseMemory() {
+            for (Parameter * parameter : parameters) {
+                if (parameter != NULL) {
+                    delete parameter;
+                }
             }
+            parameters.clear();
+            parameters.shrink_to_fit();
         }
     };
 }