Add FmqType to templatize MQDescriptor
Also removed PredefinedType and renamed MQDescriptorSync to
fmq_sync and MQDescriptorUnsync to fmq_unsync.
Test: FMQ unit tests.
Bug: 33948735
Merged-In: I7f2802b76000a1e1a55d02381cca202530a0cd18
Change-Id: I7f2802b76000a1e1a55d02381cca202530a0cd18
diff --git a/AST.cpp b/AST.cpp
index 2d2898c..8a49512 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -22,7 +22,7 @@
#include "HandleType.h"
#include "Interface.h"
#include "Location.h"
-#include "PredefinedType.h"
+#include "FmqType.h"
#include "Scope.h"
#include "TypeDef.h"
diff --git a/Android.bp b/Android.bp
index 7f32fcd..38e3287 100644
--- a/Android.bp
+++ b/Android.bp
@@ -42,7 +42,7 @@
"Method.cpp",
"NamedType.cpp",
"PointerType.cpp",
- "PredefinedType.cpp",
+ "FmqType.cpp",
"RefType.cpp",
"ScalarType.cpp",
"Scope.cpp",
diff --git a/PredefinedType.cpp b/FmqType.cpp
similarity index 84%
rename from PredefinedType.cpp
rename to FmqType.cpp
index fb015a4..c22fd55 100644
--- a/PredefinedType.cpp
+++ b/FmqType.cpp
@@ -14,28 +14,28 @@
* limitations under the License.
*/
-#include "PredefinedType.h"
+#include "FmqType.h"
#include <hidl-util/Formatter.h>
#include <android-base/logging.h>
namespace android {
-PredefinedType::PredefinedType(const char *nsp, const char *name)
+FmqType::FmqType(const char *nsp, const char *name)
: mNamespace(nsp), mName(name) {
}
-void PredefinedType::addNamedTypesToSet(std::set<const FQName> &) const {
+void FmqType::addNamedTypesToSet(std::set<const FQName> &) const {
// do nothing
}
-std::string PredefinedType::fullName() const {
+std::string FmqType::fullName() const {
return mNamespace +
(mNamespace.empty() ? "" : "::") +
- mName;
+ mName + "<" + mElementType->getCppStackType(true) + ">";
}
-std::string PredefinedType::getCppType(
+std::string FmqType::getCppType(
StorageMode mode,
bool) const {
@@ -53,7 +53,7 @@
}
}
-void PredefinedType::emitReaderWriter(
+void FmqType::emitReaderWriter(
Formatter &out,
const std::string &name,
const std::string &parcelObj,
@@ -117,7 +117,7 @@
"0 /* parentOffset */");
}
-void PredefinedType::emitReaderWriterEmbedded(
+void FmqType::emitReaderWriterEmbedded(
Formatter &out,
size_t /* depth */,
const std::string &name,
@@ -144,17 +144,21 @@
mNamespace);
}
-bool PredefinedType::isJavaCompatible() const {
+bool FmqType::isJavaCompatible() const {
return false;
}
-bool PredefinedType::needsEmbeddedReadWrite() const {
+bool FmqType::needsEmbeddedReadWrite() const {
return true;
}
-bool PredefinedType::resultNeedsDeref() const {
+bool FmqType::resultNeedsDeref() const {
return true;
}
+bool FmqType::isCompatibleElementType(Type *elementType) const {
+ return (!elementType->isInterface() && !elementType->needsEmbeddedReadWrite());
+}
+
} // namespace android
diff --git a/PredefinedType.h b/FmqType.h
similarity index 87%
rename from PredefinedType.h
rename to FmqType.h
index a3f2e81..054a25e 100644
--- a/PredefinedType.h
+++ b/FmqType.h
@@ -14,16 +14,16 @@
* limitations under the License.
*/
-#ifndef PREDEFINED_TYPE_H_
+#ifndef FMQ_TYPE_H_
-#define PREDEFINED_TYPE_H_
+#define FMQ_TYPE_H_
#include "Type.h"
namespace android {
-struct PredefinedType : public Type {
- PredefinedType(const char *nsp, const char *name);
+struct FmqType : public TemplatedType {
+ FmqType(const char *nsp, const char *name);
void addNamedTypesToSet(std::set<const FQName> &set) const override;
@@ -58,14 +58,14 @@
bool needsEmbeddedReadWrite() const override;
bool resultNeedsDeref() const override;
-
+ bool isCompatibleElementType(Type *elementType) const override;
private:
std::string mNamespace;
std::string mName;
- DISALLOW_COPY_AND_ASSIGN(PredefinedType);
+ DISALLOW_COPY_AND_ASSIGN(FmqType);
};
} // namespace android
-#endif // PREDEFINED_TYPE_H_
+#endif // FMQ_TYPE_H_
diff --git a/hidl-gen_l.ll b/hidl-gen_l.ll
index e6b4bef..1fb0127 100644
--- a/hidl-gen_l.ll
+++ b/hidl-gen_l.ll
@@ -44,7 +44,7 @@
#include "StringType.h"
#include "VectorType.h"
#include "RefType.h"
-#include "PredefinedType.h"
+#include "FmqType.h"
#include "hidl-gen_y.h"
@@ -118,8 +118,8 @@
"pointer" { yylval->type = new PointerType; return token::TYPE; }
"string" { yylval->type = new StringType; return token::TYPE; }
-"MQDescriptorSync" { yylval->type = new PredefinedType("::android::hardware", "MQDescriptorSync"); return token::TYPE; }
-"MQDescriptorUnsync" { yylval->type = new PredefinedType("::android::hardware", "MQDescriptorUnsync"); return token::TYPE; }
+"fmq_sync" { yylval->type = new FmqType("::android::hardware", "MQDescriptorSync"); return token::TEMPLATED; }
+"fmq_unsync" { yylval->type = new FmqType("::android::hardware", "MQDescriptorUnsync"); return token::TEMPLATED; }
"(" { return('('); }
")" { return(')'); }
diff --git a/hidl-gen_y.yy b/hidl-gen_y.yy
index 75843c5..4548b68 100644
--- a/hidl-gen_y.yy
+++ b/hidl-gen_y.yy
@@ -90,7 +90,7 @@
"int8_t", "int16_t", "int32_t", "int64_t", "bool", "float", "double",
"interface", "struct", "union", "string", "vec", "enum", "ref", "handle",
"package", "import", "typedef", "generates", "oneway", "extends",
- "MQDescriptorSync", "MQDescriptorUnsync",
+ "fmq_sync", "fmq_unsync",
});
static const std::vector<std::string> cppKeywords({
"alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit",
diff --git a/test/vendor/1.0/IVendor.hal b/test/vendor/1.0/IVendor.hal
index 1ccaa0d..f888a2d 100644
--- a/test/vendor/1.0/IVendor.hal
+++ b/test/vendor/1.0/IVendor.hal
@@ -21,14 +21,14 @@
struct StructTest {
handle a;
vec<uint8_t> b;
- MQDescriptorSync c;
+ fmq_sync<uint8_t> c;
string d;
uint8_t[4][4] e;
};
fun1(handle a) generates(handle b);
fun2(vec<uint8_t> a) generates(vec<uint8_t> b);
- fun3(MQDescriptorSync a) generates(MQDescriptorSync b);
+ fun3(fmq_sync<uint8_t> a) generates(fmq_sync<uint8_t> b);
fun4(string a) generates(string b);
fun5(uint8_t[4][4] a) generates(uint8_t[4][4] b);