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 ARRAY_TYPE_H_
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define ARRAY_TYPE_H_
20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
21505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov#include "Reference.h"
22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Type.h"
23c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
24709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber#include <vector>
25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
28f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongstruct ConstantExpression;
29f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong
30c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct ArrayType : public Type {
3163f399021d053453704d41845d4ebcc06fe01738Timur Iskhakov    ArrayType(const Reference<Type>& elementType, ConstantExpression* size, Scope* parent);
32709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
33709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    bool isArray() const override;
345dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool deepCanCheckEquality(std::unordered_set<const Type*>* visited) const override;
35709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
3624e605b5194d969a1558d94896d69cc554881e46Timur Iskhakov    const Type* getElementType() const;
37f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber
38bd33e3854555589f312c4d6d89491e2f5cc2f782Yifan Hong    void appendDimension(ConstantExpression *size);
39f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    size_t countDimensions() const;
40c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
410ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland    std::string typeName() const override;
420ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland
43b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const Reference<Type>*> getReferences() const override;
4433431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov
45b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const ConstantExpression*> getConstantExpressions() const override;
46891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov
470737c2a4a10731188ee9a94f864b0c7b462d55dbTimur Iskhakov    // Extends existing array by adding another dimension.
480737c2a4a10731188ee9a94f864b0c7b462d55dbTimur Iskhakov    status_t resolveInheritance() override;
490737c2a4a10731188ee9a94f864b0c7b462d55dbTimur Iskhakov
50cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov    status_t validate() const override;
51cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov
52979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    std::string getCppType(StorageMode mode,
53979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                           bool specifyNamespaces) const override;
54979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland
5530b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    std::string getInternalDataCppType() const;
5630b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong
574ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    std::string getJavaType(bool forInitializer) const override;
582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
59f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    std::string getJavaWrapperType() const override;
60f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber
61c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    std::string getVtsType() const override;
62c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriter(
64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const override;
70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbedded(
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
73f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber            size_t depth,
74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
75be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong            const std::string &sanitizedName,
76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
81881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
82881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText) const override;
83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
84bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    void emitResolveReferences(
85bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
86bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
87bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
88bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
89bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
90bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
91bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode) const override;
92bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
93bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    void emitResolveReferencesEmbedded(
94bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
95bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            size_t depth,
96bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
97bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &sanitizedName,
98bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
99bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
100bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
101bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
102bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode,
103bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parentName,
104bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &offsetText) const override;
105bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
106e45b5303e072043679483a70606f6c00dde17382Yifan Hong    void emitJavaDump(
107e45b5303e072043679483a70606f6c00dde17382Yifan Hong            Formatter &out,
108e45b5303e072043679483a70606f6c00dde17382Yifan Hong            const std::string &streamName,
109e45b5303e072043679483a70606f6c00dde17382Yifan Hong            const std::string &name) const override;
110e45b5303e072043679483a70606f6c00dde17382Yifan Hong
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    bool needsEmbeddedReadWrite() const override;
1125dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool deepNeedsResolveReferences(std::unordered_set<const Type*>* visited) const override;
113f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    bool resultNeedsDeref() const override;
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1152831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriter(
1162831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
1172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
1182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader) const override;
1202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
12185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    void emitJavaFieldInitializer(
12285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, const std::string &fieldName) const override;
12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    void emitJavaFieldReaderWriter(
12585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
1264c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            size_t depth,
127709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            const std::string &parcelName,
12885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &blobName,
12985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName,
13085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &offset,
13185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            bool isReader) const override;
13285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
133368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland    void emitVtsTypeDeclarations(Formatter& out) const override;
1345158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1355dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool deepIsJavaCompatible(std::unordered_set<const Type*>* visited) const override;
1365dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov    bool deepContainsPointer(std::unordered_set<const Type*>* visited) const override;
13770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
13885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    void getAlignmentAndSize(size_t *align, size_t *size) const override;
13985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
140505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov   private:
141505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    Reference<Type> mElementType;
142505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov    std::vector<ConstantExpression*> mSizes;
143c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
144bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    size_t dimension() const;
145bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
146c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(ArrayType);
147c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
148c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
149c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
150c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
151c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // ARRAY_TYPE_H_
152c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
153