Type.h revision bf459bcedc2ab1a22a9cc290fbcc0a5462e63690
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
38fd4afabde8fb9bbdd0021addeb9fbb62428f2c17Andreas Huber    Type *ref() { return this; }
39fd4afabde8fb9bbdd0021addeb9fbb62428f2c17Andreas Huber
405345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber    virtual bool isScope() const;
41a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    virtual bool isInterface() const;
428d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    virtual bool isEnum() const;
438d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    virtual bool isTypeDef() const;
44295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    virtual bool isBinder() const;
4539fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber    virtual bool isNamedType() const;
46f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber    virtual bool isCompoundType() const;
47709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    virtual bool isArray() const;
48709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    virtual bool isVector() const;
498d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
50737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    virtual const ScalarType *resolveToScalarType() const;
51c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
528d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    bool isValidEnumStorageType() const;
538d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum StorageMode {
55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Stack,
56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Argument,
57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        StorageMode_Result
58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual std::string getCppType(
60979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland            StorageMode mode,
61979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland            std::string *extra,
62979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland            bool specifyNamespaces) const;
63979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland
64979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    /* gets all hidl-defined types used when this item is
65979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * printed using getCppType or getJavaType. Examples:
66979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     *
67979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * vec<vec<vec<IFoo>>>: IFoo is added to the set
68979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * (the hypothetical type pair)
69979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * pair<IFoo, IBar>: IFoo and IBar are added to the set
70979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * int32_t: nothing is added to the set
71979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * string: nothing is added to the set
72979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     * IFoo: IFoo is added to the set
73979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland     */
74979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    virtual void addNamedTypesToSet(std::set<const FQName> &set) const = 0;
75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    // Convenience, gets StorageMode_Stack type.
774c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    std::string getCppType(
784c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            std::string *extra, bool specifyNamespaces = true) const;
79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
804c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    std::string getCppResultType(
814c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            std::string *extra, bool specifyNamespaces = true) const;
824c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
834c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    std::string getCppArgumentType(
844c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            std::string *extra, bool specifyNamespaces = true) const;
854c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
864c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    // For an array type, "extra" accumulates dimensionality information,
874c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    // if forInitializer == true, actual dimensions are included, i.e. [3][5],
884c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    // otherwise (and by default), they are omitted, i.e. [][].
894c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    virtual std::string getJavaType(
904c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            std::string *extra, bool forInitializer = false) const;
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
9285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual std::string getJavaWrapperType() const;
932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual std::string getJavaSuffix() const;
942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    enum ErrorMode {
96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Ignore,
97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Goto,
98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode_Break,
99737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        ErrorMode_Return,
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    };
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriter(
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const;
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual void emitReaderWriterEmbedded(
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
111f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber            size_t depth,
112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
117881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
118881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText) const;
120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
121bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual void emitResolveReferences(
122bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
123bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
124bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
125bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
126bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
127bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
128bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode) const;
129bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
130bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual void emitResolveReferencesEmbedded(
131bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
132bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            size_t depth,
133bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
134bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &sanitizedName,
135bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
136bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
137bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
138bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
139bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode,
140bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parentName,
141bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &offsetText) const;
142bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
1432831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    virtual void emitJavaReaderWriter(
1442831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
1452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
1462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1472831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader) const;
1482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
14985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldInitializer(
15085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
15185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName) const;
15285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
15385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void emitJavaFieldReaderWriter(
15485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
1554c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            size_t depth,
156709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            const std::string &parcelName,
15785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &blobName,
15885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName,
15985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &offset,
16085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            bool isReader) const;
16185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDeclarations(Formatter &out) const;
163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual status_t emitTypeDefinitions(
165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out, const std::string prefix) const;
166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
16785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual status_t emitJavaTypeDeclarations(
16885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, bool atTopLevel) const;
1692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
170881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool needsEmbeddedReadWrite() const;
171bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    virtual bool needsResolveReferences() const;
172881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    virtual bool resultNeedsDeref() const;
173881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1745158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Generates type declaration for vts proto file.
1755158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // TODO (b/30844146): make it a pure virtual method.
1765158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    virtual status_t emitVtsTypeDeclarations(Formatter &out) const;
177864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // Generates type declaration as attribute of method (return value or method
178864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // argument) or attribute of compound type for vts proto file.
179864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    virtual status_t emitVtsAttributeType(Formatter &out) const;
1805158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
18170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    // Returns true iff this type is supported through the Java backend.
18270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    virtual bool isJavaCompatible() const;
18370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
18485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
18585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
1867c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    void setAnnotations(std::vector<Annotation *> *annotations);
1877c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    const std::vector<Annotation *> &annotations() const;
1887c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
189881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberprotected:
190881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError(Formatter &out, ErrorMode mode) const;
191881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void handleError2(Formatter &out, ErrorMode mode) const;
192881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
193881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbeddedForTypeName(
194881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
197881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
198881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
202881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText,
203881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &typeName,
204881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &childName) const;
205881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2062831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriterWithSuffix(
2072831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
2082831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
2092831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
2102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader,
2112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &suffix,
2122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &extra) const;
2132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
214c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate:
2157c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    std::vector<Annotation *> *mAnnotations;
2167c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
217c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(Type);
218c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
219c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
220bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong/* Base type for VectorType and RefType. */
221bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongstruct TemplatedType : public Type {
222bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    void setElementType(Type *elementType);
223bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongprotected:
224bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    TemplatedType();
225bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    Type *mElementType;
226bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongprivate:
227bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    DISALLOW_COPY_AND_ASSIGN(TemplatedType);
228bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong};
229bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
230c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
231c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
232c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // TYPE_H_
233c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
234