ArrayType.h revision 0737c2a4a10731188ee9a94f864b0c7b462d55db
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; 34c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong bool canCheckEquality() 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; 112bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool needsResolveReferences() 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 1335158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang status_t emitVtsTypeDeclarations(Formatter &out) const override; 1345158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 13570a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber bool isJavaCompatible() const override; 13660d3b22101e911242d2d41c8dc8309e8706f1fe1Andreas Huber bool containsPointer() 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