Type.h revision cec46c48853a8c1246656d0095a9faa3fad5c4f9
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#ifndef TYPE_H_
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define TYPE_H_
20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include <android-base/macros.h>
22881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <utils/Errors.h>
23979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland#include <set>
24cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <string>
25cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov#include <vector>
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
27505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov#include "Reference.h"
28505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov
29c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
30c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Formatter;
32737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberstruct ScalarType;
33979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstruct FQName;
34c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
35c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Type {
36c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    Type();
37c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    virtual ~Type();
38c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
3999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isArray() const;
40295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    virtual bool isBinder() const;
41abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isBitField() const;
42f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber    virtual bool isCompoundType() const;
4399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isEnum() const;
44abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isHandle() const;
4599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isInterface() const;
4699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isNamedType() const;
47397b5e1957cc1a1ad3365e294437324d5c088039Steven Moreland    virtual bool isMemory() const;
4899e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isPointer() const;
4999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isScope() const;
50abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isScalar() const;
51abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isString() const;
52abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isTemplatedType() const;
5399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isTypeDef() const;
54709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    virtual bool isVector() const;
558d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
56cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // Recursive tree pass that completes type declarations
57cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // that depend on super types
58cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    virtual status_t resolveInheritance();
59cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
60cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // Recursive tree pass that evaluates constant expressions
61cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    virtual status_t evaluate();
62cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
63cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // Recursive tree pass that validates all type-related
64cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // syntax restrictions
65cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    virtual status_t validate() const;
66cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
67cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // Runs recursive tree pass for completing type declaration in references
68cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // The only current case when type is declared in reference is
69cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // array (array size is reference-related) and templates (as they can
70cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // contain array as element type)
71cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // A special call is needed to avoid recursive loop. ex:
72cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    // struct S { S[42] arr; }; -- we need to avoid pass call for S from array
73cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    status_t callForReference(std::function<status_t(Type*)> func);
74cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    status_t callForReference(std::function<status_t(const Type*)> func) const;
75cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
76737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    virtual const ScalarType *resolveToScalarType() const;
77c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
780ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland    virtual std::string typeName() const = 0;
7930bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
808d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    bool isValidEnumStorageType() const;
819df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland    virtual bool isElidableType() const;
82c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    virtual bool canCheckEquality() const;
838d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum StorageMode {
85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Stack,
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Argument,
87ac5878945afde379e41d9c93de44c32537f868b1Martijn Coenen        StorageMode_Result,
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
893b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong
90e30ee9b06ac578006161e84633db91289f889068Steven Moreland    // specifyNamespaces: whether to specify namespaces for built-in types
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual std::string getCppType(
92979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland            StorageMode mode,
933b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong            bool specifyNamespaces) const;
943b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong
953b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string decorateCppName(
963b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong            const std::string &name,
973b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong            StorageMode mode,
98979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland            bool specifyNamespaces) const;
99979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland
1003b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string getCppStackType(bool specifyNamespaces = true) const;
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1023b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string getCppResultType(bool specifyNamespaces = true) const;
1034c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
1043b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string getCppArgumentType(bool specifyNamespaces = true) const;
1054c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
1064ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    // For an array type, dimensionality information will be accumulated at the
1074ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    // end of the returned string.
1084c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    // if forInitializer == true, actual dimensions are included, i.e. [3][5],
1094c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    // otherwise (and by default), they are omitted, i.e. [][].
1104ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    virtual std::string getJavaType(bool forInitializer = false) const;
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
11285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual std::string getJavaWrapperType() const;
1132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual std::string getJavaSuffix() const;
1142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
115c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    virtual std::string getVtsType() const;
116e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    virtual std::string getVtsValueName() const;
117c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
118881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum ErrorMode {
119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Ignore,
120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Goto,
121881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Break,
122737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        ErrorMode_Return,
123881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriter(
125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const;
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriterEmbedded(
133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
134f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber            size_t depth,
135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
136be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong            const std::string &sanitizedName,
137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
138881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
140881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
142881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText) const;
144881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
145bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual void emitResolveReferences(
146bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
147bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
148bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
149bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
150bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
151bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
152bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode) const;
153bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
154bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual void emitResolveReferencesEmbedded(
155bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
156bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            size_t depth,
157bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
158bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &sanitizedName,
159bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
160bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
161bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
162bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
163bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode,
164bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parentName,
165bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &offsetText) const;
166bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
167f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    virtual void emitDump(
168f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            Formatter &out,
169f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &streamName,
170f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &name) const;
171f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
172e45b5303e072043679483a70606f6c00dde17382Yifan Hong    virtual void emitJavaDump(
173e45b5303e072043679483a70606f6c00dde17382Yifan Hong            Formatter &out,
174e45b5303e072043679483a70606f6c00dde17382Yifan Hong            const std::string &streamName,
175e45b5303e072043679483a70606f6c00dde17382Yifan Hong            const std::string &name) const;
176e45b5303e072043679483a70606f6c00dde17382Yifan Hong
17700f471711684903fd747e7871edf437ca54ed397Yifan Hong    virtual bool useParentInEmitResolveReferencesEmbedded() const;
17800f471711684903fd747e7871edf437ca54ed397Yifan Hong
179244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    virtual bool useNameInEmitReaderWriterEmbedded(bool isReader) const;
180244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
1812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual void emitJavaReaderWriter(
1822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
1832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
1842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader) const;
1862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
18785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldInitializer(
18885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
18985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName) const;
19085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
19185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldReaderWriter(
19285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
1934c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            size_t depth,
194709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            const std::string &parcelName,
19585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &blobName,
19685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName,
19785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &offset,
19885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            bool isReader) const;
19985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDeclarations(Formatter &out) const;
201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
202e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    // Emit any declarations pertaining to this type that have to be
203e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    // at global scope, i.e. enum class operators.
204e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    virtual status_t emitGlobalTypeDeclarations(Formatter &out) const;
205e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber
206244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    // Emit any declarations pertaining to this type that have to be
207244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel
208244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    virtual status_t emitGlobalHwDeclarations(Formatter &out) const;
209244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
2108c90cc59bf93bd0c08970b4488067a33015d4a1cChih-Hung Hsieh    virtual status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const;
211881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
21285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual status_t emitJavaTypeDeclarations(
21385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, bool atTopLevel) const;
2142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
215881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool needsEmbeddedReadWrite() const;
216bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual bool needsResolveReferences() const;
217881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool resultNeedsDeref() const;
218881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Generates type declaration for vts proto file.
2205158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // TODO (b/30844146): make it a pure virtual method.
2215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
222864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // Generates type declaration as attribute of method (return value or method
223864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // argument) or attribute of compound type for vts proto file.
224864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    virtual status_t emitVtsAttributeType(Formatter &out) const;
2255158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
22670a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    // Returns true iff this type is supported through the Java backend.
22770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    virtual bool isJavaCompatible() const;
22860d3b22101e911242d2d41c8dc8309e8706f1fe1Andreas Huber    virtual bool containsPointer() const;
22985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
23085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
231019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber    virtual void appendToExportedTypesVector(
232019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber            std::vector<const Type *> *exportedTypes) const;
233019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
2341c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber    virtual status_t emitExportedHeader(Formatter &out, bool forJava) const;
235019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
236881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberprotected:
237881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError(Formatter &out, ErrorMode mode) const;
238881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
239881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbeddedForTypeName(
240881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
241881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
242881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
243881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
244881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
245881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
246881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
247881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
248881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText,
249881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &typeName,
250244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            const std::string &childName,
251244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            const std::string &funcNamespace) const;
252881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriterWithSuffix(
2542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
2552831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
2562831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
2572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader,
2582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &suffix,
2592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &extra) const;
2602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
261f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    void emitDumpWithMethod(
262f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            Formatter &out,
263f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &streamName,
264f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &methodName,
265f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &name) const;
266f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
267c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate:
268c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(Type);
269c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
270c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
271bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong/* Base type for VectorType and RefType. */
272bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongstruct TemplatedType : public Type {
273505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    void setElementType(const Reference<Type>& elementType);
274505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    Type* getElementType() const;
275abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    bool isTemplatedType() const override;
276505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    virtual bool isCompatibleElementType(Type* elementType) const = 0;
277e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    status_t emitVtsTypeDeclarations(Formatter &out) const override;
278e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    status_t emitVtsAttributeType(Formatter &out) const override;
279cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
280cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    virtual status_t evaluate() override;
281cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    virtual status_t validate() const override;
282cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
283cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov   protected:
284bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    TemplatedType();
285505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    Reference<Type> mElementType;
286505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov
287505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov   private:
288bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    DISALLOW_COPY_AND_ASSIGN(TemplatedType);
289bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong};
290bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
291c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
292c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
293c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // TYPE_H_
294c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
295