11aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber/*
21aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Copyright (C) 2016 The Android Open Source Project
31aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
41aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * you may not use this file except in compliance with the License.
61aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * You may obtain a copy of the License at
71aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
81aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
101aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Unless required by applicable law or agreed to in writing, software
111aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * See the License for the specific language governing permissions and
141aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * limitations under the License.
151aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber */
161aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber
17c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Type.h"
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
197c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber#include "Annotation.h"
208d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber#include "ScalarType.h"
21881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
22a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h>
23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <android-base/logging.h>
24881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
277c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas HuberType::Type()
287c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    : mAnnotations(nullptr) {
297c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
307c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberType::~Type() {}
32c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
337c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Hubervoid Type::setAnnotations(std::vector<Annotation *> *annotations) {
347c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    mAnnotations = annotations;
357c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
367c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
377c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huberconst std::vector<Annotation *> &Type::annotations() const {
387c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    return *mAnnotations;
397c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
407c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
415345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huberbool Type::isScope() const {
425345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber    return false;
435345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber}
445345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber
45a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huberbool Type::isInterface() const {
46a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    return false;
47a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber}
48a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber
49abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isScalar() const {
50abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
51abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
52abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
53abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isString() const {
54abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
55abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
56abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
578d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isEnum() const {
588d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
598d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
608d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
61abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isBitField() const {
62abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
63abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
64abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
65abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isHandle() const {
66abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
67abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
68abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
698d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isTypeDef() const {
708d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
718d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
728d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
73295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huberbool Type::isBinder() const {
74295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    return false;
75295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber}
76295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber
7739fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huberbool Type::isNamedType() const {
7839fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber    return false;
7939fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber}
8039fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber
8160864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Morelandbool Type::isMemory() const {
8260864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    return false;
8360864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland}
8460864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
85f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huberbool Type::isCompoundType() const {
86f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber    return false;
87f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber}
88f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber
89709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isArray() const {
90709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return false;
91709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
92709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
93709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isVector() const {
9499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    return false;
9599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen}
9699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
97abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isTemplatedType() const {
98abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
99abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
100abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
10199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenbool Type::isPointer() const {
102709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return false;
103709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
104709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
105737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *Type::resolveToScalarType() const {
106737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    return NULL;
107737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber}
108737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
1098d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isValidEnumStorageType() const {
1108d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    const ScalarType *scalarType = resolveToScalarType();
1118d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1128d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    if (scalarType == NULL) {
1138d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        return false;
1148d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    }
1158d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1168d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return scalarType->isValidEnumStorageType();
1178d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
1188d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1199df5244c1dd4508cc2e25f8a04d363903912d19cSteven Morelandbool Type::isElidableType() const {
1209df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland    return false;
1219df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland}
1229df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland
123c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hongbool Type::canCheckEquality() const {
124c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    return false;
125c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong}
126c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong
1273b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppType(StorageMode, bool) const {
128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return std::string();
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1323b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::decorateCppName(
1333b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong        const std::string &name, StorageMode mode, bool specifyNamespaces) const {
1343b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(mode, specifyNamespaces) + " " + name;
1353b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong}
1363b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong
1374ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string Type::getJavaType(bool /* forInitializer */) const {
1384c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    CHECK(!"Should not be here");
1394c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    return std::string();
1404c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber}
1414c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
14285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstd::string Type::getJavaWrapperType() const {
1434ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    return getJavaType();
14485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
14585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
1462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string Type::getJavaSuffix() const {
1472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(!"Should not be here");
1482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return std::string();
1492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
151c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string Type::getVtsType() const {
152c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    CHECK(!"Should not be here");
153c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    return std::string();
154c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang}
155c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
156e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhangstd::string Type::getVtsValueName() const {
157e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    CHECK(!"Should not be here");
158e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    return std::string();
159e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang}
160e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang
161881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriter(
162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode) const {
168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
169881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
170881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
171bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferences(
172bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
173bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
174bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
175bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
176bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
177bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
178bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode) const {
179bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
180bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
181bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
182bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferencesEmbedded(
183bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
184bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        size_t,
185bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
186bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
187bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
188bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
189bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
190bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
191bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode,
192bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
193bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &) const {
194bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
195bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
196bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
197f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hongvoid Type::emitDump(
198f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        Formatter &out,
199f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        const std::string &streamName,
200f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        const std::string &name) const {
2019ab1e9e4fe5c1d0565c91ad2d45dd4b9f59e4c5bHridya Valsaraju    emitDumpWithMethod(out, streamName, "::android::hardware::toString", name);
202f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong}
203f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
204f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hongvoid Type::emitDumpWithMethod(
205f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        Formatter &out,
206f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        const std::string &streamName,
207f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        const std::string &methodName,
208f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        const std::string &name) const {
209f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    out << streamName
210f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        << " += "
211f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        << methodName
212f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        << "("
213f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        << name
214f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        << ");\n";
215f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong}
216f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
217e45b5303e072043679483a70606f6c00dde17382Yifan Hongvoid Type::emitJavaDump(
218e45b5303e072043679483a70606f6c00dde17382Yifan Hong        Formatter &out,
219e45b5303e072043679483a70606f6c00dde17382Yifan Hong        const std::string &streamName,
220e45b5303e072043679483a70606f6c00dde17382Yifan Hong        const std::string &name) const {
221e45b5303e072043679483a70606f6c00dde17382Yifan Hong    out << streamName << ".append(" << name << ");\n";
222e45b5303e072043679483a70606f6c00dde17382Yifan Hong}
223e45b5303e072043679483a70606f6c00dde17382Yifan Hong
22400f471711684903fd747e7871edf437ca54ed397Yifan Hongbool Type::useParentInEmitResolveReferencesEmbedded() const {
225244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return needsResolveReferences();
226244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong}
227244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
228244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongbool Type::useNameInEmitReaderWriterEmbedded(bool) const {
229244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return needsEmbeddedReadWrite();
23000f471711684903fd747e7871edf437ca54ed397Yifan Hong}
23100f471711684903fd747e7871edf437ca54ed397Yifan Hong
232881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbedded(
233881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
234f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        size_t,
235881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
236be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong        const std::string &,
237881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
238881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
239881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
240881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
241881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode,
242881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
243881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &) const {
244881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
245881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
246881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriter(
2482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
2492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
2502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
2512831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader) const {
2522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    emitJavaReaderWriterWithSuffix(
2532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out,
2542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            parcelObj,
2552831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            argName,
2562831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            isReader,
2572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            getJavaSuffix(),
2582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            "" /* extra */);
2592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
2602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
26185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldInitializer(
26285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
26385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName) const {
2644ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    out << getJavaType()
26585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << " "
26685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
26785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ";\n";
26885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
26985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
27085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldReaderWriter(
27185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &,
2724c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber        size_t,
27385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
27485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
27585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
276709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        const std::string &,
27785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool) const {
27885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
27985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
28085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
281881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError(Formatter &out, ErrorMode mode) const {
282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
285549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* _hidl_err ignored! */\n\n";
286881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
287881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
288881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
289881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
290881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
291549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { goto _hidl_error; }\n\n";
292881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
293881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
294881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
295881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
296881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
297549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { break; }\n\n";
298881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
299881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
300737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
301737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
302737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
303549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { return _hidl_err; }\n\n";
304737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
305737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
306881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
307881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
308881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
309881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbeddedForTypeName(
310881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
311881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
312881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
313881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
314881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
315881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
316881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
317881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
318881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText,
319881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &typeName,
320244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string &childName,
321244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string &funcNamespace) const {
322244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
323244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string parcelObjDeref =
324881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
325881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
326881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjPointer =
327881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
328881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
329244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    const std::string nameDerefed = nameIsPointer ? ("*" + name) : name;
330881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string namePointer = nameIsPointer ? name : ("&" + name);
331881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
332549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev    out << "_hidl_err = ";
333881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
334244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    if (!funcNamespace.empty()) {
335244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        out << funcNamespace << "::";
336244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    }
337244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
338244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out << (isReader ? "readEmbeddedFromParcel(\n" : "writeEmbeddedToParcel(\n");
339244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
340244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out.indent();
341244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out.indent();
342244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
343881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
344881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "const_cast<"
345881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << typeName
346857ea5f75bc814be1d5ba9ef42f8d07a00965382Martijn Coenen            << " &>("
347857ea5f75bc814be1d5ba9ef42f8d07a00965382Martijn Coenen            << nameDerefed
348244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            << "),\n";
349881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
350244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        out << nameDerefed
351244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            << ",\n";
352881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
353881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
354881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << (isReader ? parcelObjDeref : parcelObjPointer)
355881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
356881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << parentName
357881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
358881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << offsetText;
359881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
360881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (!childName.empty()) {
361881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << ", &"
362881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << childName;
363881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
364881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
365881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << ");\n\n";
366881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
367881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
368881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
369881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
370881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    handleError(out, mode);
371881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
372881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
373881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDeclarations(Formatter &) const {
374881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
375881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
376881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
377e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huberstatus_t Type::emitGlobalTypeDeclarations(Formatter &) const {
378e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    return OK;
379e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber}
380e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber
381244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongstatus_t Type::emitGlobalHwDeclarations(Formatter &) const {
382244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return OK;
383244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong}
384244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
385881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDefinitions(
386881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &, const std::string) const {
387881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
388881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
389881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
39085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t Type::emitJavaTypeDeclarations(Formatter &, bool) const {
3912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
3922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
3932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
394881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::needsEmbeddedReadWrite() const {
395881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
396881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
397881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
398bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongbool Type::needsResolveReferences() const {
399bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    return false;
400bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
401bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
402881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::resultNeedsDeref() const {
403881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
404881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
405881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
4063b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppStackType(bool specifyNamespaces) const {
4073b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Stack, specifyNamespaces);
408881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
409881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
4103b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppResultType(bool specifyNamespaces) const {
4113b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Result, specifyNamespaces);
412881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
413881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
4143b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppArgumentType(bool specifyNamespaces) const {
4153b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Argument, specifyNamespaces);
416881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
417881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
4182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriterWithSuffix(
4192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
4202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
4212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
4222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader,
4232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &suffix,
4242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &extra) const {
4252831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << parcelObj
4262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "."
4272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << (isReader ? "read" : "write")
4282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << suffix
4292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "(";
4302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4312831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (isReader) {
4322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << extra;
4332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    } else {
4342831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << (extra.empty() ? "" : (extra + ", "));
4352831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << argName;
4362831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
4372831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4382831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << ");\n";
4392831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
4402831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4415158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t Type::emitVtsTypeDeclarations(Formatter &) const {
4425158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
4435158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
4445158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
445864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Type::emitVtsAttributeType(Formatter &out) const {
4465158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return emitVtsTypeDeclarations(out);
4475158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
4485158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
44970a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huberbool Type::isJavaCompatible() const {
45070a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    return true;
45170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber}
45270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
4532639fa32c9d9cc37a15e771b26aaa6cea415b499Andreas Hubervoid Type::getAlignmentAndSize(
4542639fa32c9d9cc37a15e771b26aaa6cea415b499Andreas Huber        size_t * /* align */, size_t * /* size */) const {
4552639fa32c9d9cc37a15e771b26aaa6cea415b499Andreas Huber    CHECK(!"Should not be here.");
4562639fa32c9d9cc37a15e771b26aaa6cea415b499Andreas Huber}
4572639fa32c9d9cc37a15e771b26aaa6cea415b499Andreas Huber
4582639fa32c9d9cc37a15e771b26aaa6cea415b499Andreas Huberbool Type::containsPointer() const {
4592639fa32c9d9cc37a15e771b26aaa6cea415b499Andreas Huber    return false;
46085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
46185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
462019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Hubervoid Type::appendToExportedTypesVector(
463019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber        std::vector<const Type *> * /* exportedTypes */) const {
464019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
465019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
4661c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huberstatus_t Type::emitExportedHeader(
4671c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber        Formatter & /* out */, bool /* forJava */) const {
468019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber    return OK;
469019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
470019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
471bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong////////////////////////////////////////
472bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
473bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTemplatedType::TemplatedType() : mElementType(nullptr) {
474bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
47530bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
476bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid TemplatedType::setElementType(Type *elementType) {
477bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(mElementType == nullptr); // can only be set once.
47830bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    CHECK(isCompatibleElementType(elementType));
479bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    mElementType = elementType;
480bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
481bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
482abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan HongType *TemplatedType::getElementType() const {
483abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return mElementType;
484abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
485abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
486abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool TemplatedType::isTemplatedType() const {
487abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return true;
488abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
489abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
490e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhangstatus_t TemplatedType::emitVtsTypeDeclarations(Formatter &out) const {
491e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out << "type: " << getVtsType() << "\n";
492e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out << getVtsValueName() << ": {\n";
493e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out.indent();
494e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    status_t err = mElementType->emitVtsTypeDeclarations(out);
495e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    if (err != OK) {
496e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang        return err;
497e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    }
498e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out.unindent();
499e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out << "}\n";
500e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    return OK;
501e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang}
502e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang
503e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhangstatus_t TemplatedType::emitVtsAttributeType(Formatter &out) const {
504e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out << "type: " << getVtsType() << "\n";
505e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out << getVtsValueName() << ": {\n";
506e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out.indent();
507e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    status_t status = mElementType->emitVtsAttributeType(out);
508e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    if (status != OK) {
509e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang        return status;
510e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    }
511e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out.unindent();
512e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    out << "}\n";
513e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    return OK;
514e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang}
515c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
516c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
517