move read/writeEmbedded[References]From/ToParcel out

from hidl_string, hidl_vec, and structs.

* Add a hwtypes.h in the autogenerated files, which
  contains the read/writeEmbeddedFrom/ToParcel
  methods for structs defined in types.h.

* Fixes the hack that remove the warnings when compiling
  the generated code (useParentInEmitResolveReferencesEmbedded())
  and add one more hack (useNameInEmitReaderWriterEmbedded())

* Some clean-up on Scope.cpp (add a forEachType function)

Test: mma
Test: hidl_test

Bug: 32756130

Change-Id: Icfd116b5d92fef78d257337c3f2ef02071f7600b
diff --git a/Type.cpp b/Type.cpp
index d7ae31a..47cea08 100644
--- a/Type.cpp
+++ b/Type.cpp
@@ -154,7 +154,11 @@
 }
 
 bool Type::useParentInEmitResolveReferencesEmbedded() const {
-    return true;
+    return needsResolveReferences();
+}
+
+bool Type::useNameInEmitReaderWriterEmbedded(bool) const {
+    return needsEmbeddedReadWrite();
 }
 
 void Type::emitReaderWriterEmbedded(
@@ -273,32 +277,40 @@
         const std::string &parentName,
         const std::string &offsetText,
         const std::string &typeName,
-        const std::string &childName) const {
-    const std::string parcelObjDeref =
+        const std::string &childName,
+        const std::string &funcNamespace) const {
+
+        const std::string parcelObjDeref =
         parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
 
     const std::string parcelObjPointer =
         parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
 
-    const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
+    const std::string nameDerefed = nameIsPointer ? ("*" + name) : name;
     const std::string namePointer = nameIsPointer ? name : ("&" + name);
 
     out << "_hidl_err = ";
 
+    if (!funcNamespace.empty()) {
+        out << funcNamespace << "::";
+    }
+
+    out << (isReader ? "readEmbeddedFromParcel(\n" : "writeEmbeddedToParcel(\n");
+
+    out.indent();
+    out.indent();
+
     if (isReader) {
         out << "const_cast<"
             << typeName
             << " *>("
             << namePointer
-            << ")->readEmbeddedFromParcel(\n";
+            << "),\n";
     } else {
-        out << nameDeref
-            << "writeEmbeddedToParcel(\n";
+        out << nameDerefed
+            << ",\n";
     }
 
-    out.indent();
-    out.indent();
-
     out << (isReader ? parcelObjDeref : parcelObjPointer)
         << ",\n"
         << parentName
@@ -326,6 +338,10 @@
     return OK;
 }
 
+status_t Type::emitGlobalHwDeclarations(Formatter &) const {
+    return OK;
+}
+
 status_t Type::emitTypeDefinitions(
         Formatter &, const std::string) const {
     return OK;