Type.h revision e9667849dd310995d1e4d12f31942f68bf992d1c
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 <string>
23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <utils/Errors.h>
247c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber#include <vector>
25979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland#include <set>
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
297c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huberstruct Annotation;
30c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Formatter;
31737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberstruct ScalarType;
32979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstruct FQName;
33c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
34c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Type {
35c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    Type();
36c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    virtual ~Type();
37c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
3899e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isArray() const;
39295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    virtual bool isBinder() const;
40abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isBitField() const;
41f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber    virtual bool isCompoundType() const;
4299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isEnum() const;
43abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isHandle() const;
4499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isInterface() const;
4599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isNamedType() const;
4699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isPointer() const;
4799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isScope() const;
48abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isScalar() const;
49abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isString() const;
50abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    virtual bool isTemplatedType() const;
5199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    virtual bool isTypeDef() const;
52709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    virtual bool isVector() const;
538d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
54737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    virtual const ScalarType *resolveToScalarType() const;
55c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
5630bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    virtual std::string typeName() const;
5730bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
588d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    bool isValidEnumStorageType() const;
599df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland    virtual bool isElidableType() const;
60c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    virtual bool canCheckEquality() const;
618d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum StorageMode {
63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Stack,
64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Argument,
65ac5878945afde379e41d9c93de44c32537f868b1Martijn Coenen        StorageMode_Result,
66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
673b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong
68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual std::string getCppType(
69979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland            StorageMode mode,
703b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong            bool specifyNamespaces) const;
713b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong
723b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string decorateCppName(
733b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong            const std::string &name,
743b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong            StorageMode mode,
75979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland            bool specifyNamespaces) const;
76979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland
77979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    /* gets all hidl-defined types used when this item is
78979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * printed using getCppType or getJavaType. Examples:
79979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     *
80979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * vec<vec<vec<IFoo>>>: IFoo is added to the set
81979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * (the hypothetical type pair)
82979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * pair<IFoo, IBar>: IFoo and IBar are added to the set
83979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * int32_t: nothing is added to the set
84979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * string: nothing is added to the set
85979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * IFoo: IFoo is added to the set
86979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     */
87979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    virtual void addNamedTypesToSet(std::set<const FQName> &set) const = 0;
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
893b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string getCppStackType(bool specifyNamespaces = true) const;
90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
913b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string getCppResultType(bool specifyNamespaces = true) const;
924c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
933b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    std::string getCppArgumentType(bool specifyNamespaces = true) const;
944c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
954ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    // For an array type, dimensionality information will be accumulated at the
964ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    // end of the returned string.
974c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    // if forInitializer == true, actual dimensions are included, i.e. [3][5],
984c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    // otherwise (and by default), they are omitted, i.e. [][].
994ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    virtual std::string getJavaType(bool forInitializer = false) const;
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
10185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual std::string getJavaWrapperType() const;
1022831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual std::string getJavaSuffix() const;
1032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
104c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    virtual std::string getVtsType() const;
105e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    virtual std::string getVtsValueName() const;
106c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum ErrorMode {
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Ignore,
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Goto,
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Break,
111737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        ErrorMode_Return,
112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriter(
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
117881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
118881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const;
120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
121881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriterEmbedded(
122881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
123f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber            size_t depth,
124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
125be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong            const std::string &sanitizedName,
126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText) const;
133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
134bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual void emitResolveReferences(
135bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
136bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
137bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
138bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
139bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
140bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
141bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode) const;
142bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
143bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual void emitResolveReferencesEmbedded(
144bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
145bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            size_t depth,
146bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
147bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &sanitizedName,
148bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
149bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
150bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
151bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
152bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode,
153bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parentName,
154bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &offsetText) const;
155bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
156f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    virtual void emitDump(
157f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            Formatter &out,
158f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &streamName,
159f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &name) const;
160f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
16100f471711684903fd747e7871edf437ca54ed397Yifan Hong    virtual bool useParentInEmitResolveReferencesEmbedded() const;
16200f471711684903fd747e7871edf437ca54ed397Yifan Hong
163244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    virtual bool useNameInEmitReaderWriterEmbedded(bool isReader) const;
164244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
1652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual void emitJavaReaderWriter(
1662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
1672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
1682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader) const;
1702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
17185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldInitializer(
17285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
17385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName) const;
17485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
17585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldReaderWriter(
17685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
1774c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            size_t depth,
178709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            const std::string &parcelName,
17985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &blobName,
18085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName,
18185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &offset,
18285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            bool isReader) const;
18385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
184881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDeclarations(Formatter &out) const;
185881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
186e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    // Emit any declarations pertaining to this type that have to be
187e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    // at global scope, i.e. enum class operators.
188e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    virtual status_t emitGlobalTypeDeclarations(Formatter &out) const;
189e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber
190244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    // Emit any declarations pertaining to this type that have to be
191244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel
192244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    virtual status_t emitGlobalHwDeclarations(Formatter &out) const;
193244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
194881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDefinitions(
195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out, const std::string prefix) const;
196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
19785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual status_t emitJavaTypeDeclarations(
19885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, bool atTopLevel) const;
1992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool needsEmbeddedReadWrite() const;
201bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual bool needsResolveReferences() const;
202881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool resultNeedsDeref() const;
203881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2045158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Generates type declaration for vts proto file.
2055158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // TODO (b/30844146): make it a pure virtual method.
2065158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
207864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // Generates type declaration as attribute of method (return value or method
208864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // argument) or attribute of compound type for vts proto file.
209864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    virtual status_t emitVtsAttributeType(Formatter &out) const;
2105158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
21170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    // Returns true iff this type is supported through the Java backend.
21270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    virtual bool isJavaCompatible() const;
21370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
21485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
21585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
2167c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    void setAnnotations(std::vector<Annotation *> *annotations);
2177c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    const std::vector<Annotation *> &annotations() const;
2187c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
219019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber    virtual void appendToExportedTypesVector(
220019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber            std::vector<const Type *> *exportedTypes) const;
221019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
2221c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber    virtual status_t emitExportedHeader(Formatter &out, bool forJava) const;
223019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
224881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberprotected:
225881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError(Formatter &out, ErrorMode mode) const;
226881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
227881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbeddedForTypeName(
228881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
229881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
230881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
231881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
232881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
233881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
234881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
235881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
236881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText,
237881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &typeName,
238244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            const std::string &childName,
239244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            const std::string &funcNamespace) const;
240881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2412831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriterWithSuffix(
2422831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
2432831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
2442831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
2452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader,
2462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &suffix,
2472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &extra) const;
2482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
249f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    void emitDumpWithMethod(
250f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            Formatter &out,
251f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &streamName,
252f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &methodName,
253f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            const std::string &name) const;
254f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
255c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate:
2567c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    std::vector<Annotation *> *mAnnotations;
2577c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
258c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(Type);
259c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
260c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
261bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong/* Base type for VectorType and RefType. */
262bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongstruct TemplatedType : public Type {
263bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    void setElementType(Type *elementType);
264abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    Type *getElementType() const;
265abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    bool isTemplatedType() const override;
26630bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    virtual bool isCompatibleElementType(Type *elementType) const = 0;
267e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    status_t emitVtsTypeDeclarations(Formatter &out) const override;
268e9667849dd310995d1e4d12f31942f68bf992d1cZhuoyao Zhang    status_t emitVtsAttributeType(Formatter &out) const override;
269bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongprotected:
270bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    TemplatedType();
271bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    Type *mElementType;
272bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongprivate:
273bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    DISALLOW_COPY_AND_ASSIGN(TemplatedType);
274bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong};
275bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
276c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
277c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
278c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // TYPE_H_
279c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
280