Add generationFunctionForFileOrPackage

This removes a ton of duplicated code that has been bothering me.

Test: hidl_hash_test
Test: mma -j64 (runs hidl-gen targets)
Change-Id: Ib9918ce9b34c396862415448900b786179673e9b
diff --git a/main.cpp b/main.cpp
index 0118ece..03ae26e 100644
--- a/main.cpp
+++ b/main.cpp
@@ -45,11 +45,15 @@
         PASS_FULL
     };
     const std::string& name() { return mKey; }
-    ValRes (*validate)(const FQName &, const std::string &language);
-    status_t (*generate)(const FQName &fqName,
-                         const char *hidl_gen,
-                         Coordinator *coordinator,
-                         const std::string &outputDir);
+
+    using ValidationFunction = std::function<ValRes(const FQName &, const std::string &language)>;
+    using GenerationFunction = std::function<status_t(const FQName &fqName,
+                                                      const char *hidl_gen,
+                                                      Coordinator *coordinator,
+                                                      const std::string &outputDir)>;
+
+    ValidationFunction validate;
+    GenerationFunction generate;
 };
 
 static status_t generateSourcesForFile(
@@ -138,6 +142,26 @@
     return OK;
 }
 
+OutputHandler::GenerationFunction generationFunctionForFileOrPackage(const std::string &language) {
+    return [language](const FQName &fqName,
+              const char *hidl_gen, Coordinator *coordinator,
+              const std::string &outputDir) -> status_t {
+        if (fqName.isFullyQualified()) {
+                    return generateSourcesForFile(fqName,
+                                                  hidl_gen,
+                                                  coordinator,
+                                                  outputDir,
+                                                  language);
+        } else {
+                    return generateSourcesForPackage(fqName,
+                                                     hidl_gen,
+                                                     coordinator,
+                                                     outputDir,
+                                                     language);
+        }
+    };
+}
+
 static std::string makeLibraryName(const FQName &packageFQName) {
     return packageFQName.string();
 }
@@ -1132,45 +1156,13 @@
     {"check",
      OutputHandler::NOT_NEEDED /* mOutputMode */,
      validateForSource,
-     [](const FQName &fqName,
-        const char *hidl_gen, Coordinator *coordinator,
-        const std::string &outputDir) -> status_t {
-            if (fqName.isFullyQualified()) {
-                        return generateSourcesForFile(fqName,
-                                                      hidl_gen,
-                                                      coordinator,
-                                                      outputDir,
-                                                      "check");
-            } else {
-                        return generateSourcesForPackage(fqName,
-                                                         hidl_gen,
-                                                         coordinator,
-                                                         outputDir,
-                                                         "check");
-            }
-        }
+     generationFunctionForFileOrPackage("check")
     },
 
     {"c++",
      OutputHandler::NEEDS_DIR /* mOutputMode */,
      validateForSource,
-     [](const FQName &fqName,
-        const char *hidl_gen, Coordinator *coordinator,
-        const std::string &outputDir) -> status_t {
-            if (fqName.isFullyQualified()) {
-                        return generateSourcesForFile(fqName,
-                                                      hidl_gen,
-                                                      coordinator,
-                                                      outputDir,
-                                                      "c++");
-            } else {
-                        return generateSourcesForPackage(fqName,
-                                                         hidl_gen,
-                                                         coordinator,
-                                                         outputDir,
-                                                         "c++");
-            }
-        }
+     generationFunctionForFileOrPackage("c++")
     },
 
     {"c++-headers",
@@ -1206,45 +1198,14 @@
     {"c++-impl",
      OutputHandler::NEEDS_DIR /* mOutputMode */,
      validateForSource,
-     [](const FQName &fqName,
-        const char *hidl_gen, Coordinator *coordinator,
-        const std::string &outputDir) -> status_t {
-            if (fqName.isFullyQualified()) {
-                        return generateSourcesForFile(fqName,
-                                                      hidl_gen,
-                                                      coordinator,
-                                                      outputDir, "c++-impl");
-            } else {
-                        return generateSourcesForPackage(fqName,
-                                                         hidl_gen,
-                                                         coordinator,
-                                                         outputDir, "c++-impl");
-            }
-        }
+     generationFunctionForFileOrPackage("c++-impl")
     },
 
 
     {"java",
      OutputHandler::NEEDS_DIR /* mOutputMode */,
      validateForSource,
-     [](const FQName &fqName,
-        const char *hidl_gen, Coordinator *coordinator,
-        const std::string &outputDir) -> status_t {
-            if (fqName.isFullyQualified()) {
-                return generateSourcesForFile(fqName,
-                                              hidl_gen,
-                                              coordinator,
-                                              outputDir,
-                                              "java");
-            }
-            else {
-                return generateSourcesForPackage(fqName,
-                                                 hidl_gen,
-                                                 coordinator,
-                                                 outputDir,
-                                                 "java");
-            }
-        }
+     generationFunctionForFileOrPackage("java")
     },
 
     {"java-constants",
@@ -1266,22 +1227,7 @@
     {"vts",
      OutputHandler::NEEDS_DIR /* mOutputMode */,
      validateForSource,
-     [](const FQName &fqName,
-        const char * hidl_gen,
-        Coordinator *coordinator,
-        const std::string &outputDir) -> status_t {
-            if (fqName.isFullyQualified()) {
-                return generateSourcesForFile(fqName,
-                                              hidl_gen,
-                                              coordinator,
-                                              outputDir, "vts");
-            } else {
-                return generateSourcesForPackage(fqName,
-                                                 hidl_gen,
-                                                 coordinator,
-                                                 outputDir, "vts");
-            }
-       }
+     generationFunctionForFileOrPackage("vts")
     },
 
     {"makefile",