ArrayType.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 ARRAY_TYPE_H_ 18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define ARRAY_TYPE_H_ 20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Type.h" 22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 23709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber#include <vector> 24c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 27f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hongstruct ConstantExpression; 28f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong 29c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct ArrayType : public Type { 30709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber // Extends existing array by adding another dimension. 31f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong ArrayType(ArrayType *srcArray, ConstantExpression *size); 32709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber 33f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong ArrayType(Type *elementType, ConstantExpression *size); 34709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber 35f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong static ArrayType *AddDimension(ArrayType *base, ConstantExpression *size); 36709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber 37709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber bool isArray() const override; 38709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber 39f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber Type *getElementType() const; 40f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber 41f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong void addDimension(ConstantExpression *size); 42f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber size_t countDimensions() const; 43c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 44979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string getCppType(StorageMode mode, 45979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string *extra, 46979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const override; 47979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland 48979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland void addNamedTypesToSet(std::set<const FQName> &set) const override; 49881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 504c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string getJavaType( 514c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber std::string *extra, bool forInitializer) const override; 522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 53f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber std::string getJavaWrapperType() const override; 54f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber 55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriter( 56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const override; 62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriterEmbedded( 64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 65f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t depth, 66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const override; 74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 75bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong void emitResolveReferences( 76bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 77bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 78bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 79bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 80bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 81bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 82bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode) const override; 83bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 84bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong void emitResolveReferencesEmbedded( 85bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 86bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong size_t depth, 87bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 88bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &sanitizedName, 89bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 90bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 91bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 92bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 93bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode, 94bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parentName, 95bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &offsetText) const override; 96bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool needsEmbeddedReadWrite() const override; 98bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool needsResolveReferences() const override; 99f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber bool resultNeedsDeref() const override; 100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1012831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber void emitJavaReaderWriter( 1022831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 1032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 1042831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 1052831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader) const override; 1062831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 10785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldInitializer( 10885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, const std::string &fieldName) const override; 10985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 11085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldReaderWriter( 11185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 1124c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 113709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 11485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 11585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 11685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 11785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const override; 11885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 1195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang status_t emitVtsTypeDeclarations(Formatter &out) const override; 1205158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 12170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber bool isJavaCompatible() const override; 12270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber 12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void getAlignmentAndSize(size_t *align, size_t *size) const override; 12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 125c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate: 126c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber Type *mElementType; 127709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber std::vector<size_t> mSizes; 128f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong std::vector<std::string> mSizeComments; 129c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 130bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong size_t dimension() const; 131bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 132c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber DISALLOW_COPY_AND_ASSIGN(ArrayType); 133c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}; 134c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 135c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 136c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 137c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif // ARRAY_TYPE_H_ 138c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 139