c++-impl: gen server stub boilerplate

-Lc++-impl now generates a default implementation for all
the interfaces in the specified package. The method
implementations are all left empty.

The default implementation also contains a special function,
HIDL_FETCH_IFOO(), which is used to retrieve an instance of
a particular interface in pass-through mode. For that to work,
the default implementation must live in a shared-library with
a well-known name, eg android.hardware.tests.foo@1.0.impl.so.

Sample invocation:
hidl-gen -o tmp/impl/ -Lc++-impl -randroid.hardware:hardware/interfaces
android.hardware.tests.foo@1.0

Bug: 31228745
Change-Id: I747aa47cb76931eed85179b8131d2efd3f887471
diff --git a/AST.h b/AST.h
index f62425a..3040c22 100644
--- a/AST.h
+++ b/AST.h
@@ -72,6 +72,7 @@
     void addImportedAST(AST *ast);
 
     status_t generateCpp(const std::string &outputPath) const;
+    status_t generateCppImpl(const std::string &outputPath) const;
 
     status_t generateJava(
             const std::string &outputPath, const char *limitToType) const;
@@ -146,9 +147,14 @@
 
     enum MethodLocation {
         PROXY_HEADER,
-        STUB_HEADER
+        STUB_HEADER,
+        IMPL_HEADER,
+        IMPL_SOURCE
     };
 
+    status_t generateStubImplHeader(const std::string &outputPath) const;
+    status_t generateStubImplSource(const std::string &outputPath) const;
+
     status_t generateMethods(Formatter &out,
                              const std::string &className,
                              MethodLocation type,
@@ -157,10 +163,20 @@
                                 const std::string &className,
                                 const Method *method,
                                 bool specifyNamespaces) const;
-    status_t generateProxyMethod(Formatter &out,
-                                 const std::string &className,
-                                 const Method *method,
-                                 bool specifyNamespaces) const;
+    status_t generateProxyDeclaration(Formatter &out,
+                                      const std::string &className,
+                                      const Method *method,
+                                      bool specifyNamespaces) const;
+    status_t generateStubImplDeclaration(Formatter &out,
+                                         const std::string &className,
+                                         const Method *method,
+                                         bool specifyNamespaces) const;
+    status_t generateStubImplMethod(Formatter &out,
+                                    const std::string &className,
+                                    const Method *method,
+                                    bool specifyNamespaces) const;
+
+    void generateFetchSymbol(Formatter &out, const std::string &ifaceName) const;
 
     status_t generateProxySource(
             Formatter &out, const std::string &baseName) const;