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 COMPOUND_TYPE_H_ 18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define COMPOUND_TYPE_H_ 20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 21505316c499a4dbb95f6567e8531fb6f1e74c3dedTimur Iskhakov#include "Reference.h" 22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Scope.h" 23c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 24881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <vector> 25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct CompoundType : public Scope { 29c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber enum Style { 30c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber STYLE_STRUCT, 31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber STYLE_UNION, 32c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber }; 33c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 34565b0137b2ad0e8e239d38e92c025f096de62f2dTimur Iskhakov CompoundType(Style style, const char* localName, const FQName& fullName, 35565b0137b2ad0e8e239d38e92c025f096de62f2dTimur Iskhakov const Location& location, Scope* parent); 36c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 3727e85db4f2a8740d24aa5b200edc9cbd4d7de8a9Yifan Hong Style style() const; 3827e85db4f2a8740d24aa5b200edc9cbd4d7de8a9Yifan Hong 39cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov void setFields(std::vector<NamedReference<Type>*>* fields); 40c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 41f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber bool isCompoundType() const override; 42f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber 435dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool deepCanCheckEquality(std::unordered_set<const Type*>* visited) const override; 44c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong 450ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland std::string typeName() const override; 460ecc7b8aca24a5618512610bb6371bdb91b5fdc2Steven Moreland 47b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov std::vector<const Reference<Type>*> getReferences() const override; 4833431e6cd425c6cd179080442a8616e2baa20aaeTimur Iskhakov 49cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov status_t validate() const override; 50cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov status_t validateUniqueNames() const; 51cec46c48853a8c1246656d0095a9faa3fad5c4f9Timur Iskhakov 52979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string getCppType(StorageMode mode, 53979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const override; 54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 554ed1347cd29e6e07acad368891bb03078c798abaYifan Hong std::string getJavaType(bool forInitializer) const override; 5685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 57c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang std::string getVtsType() const override; 58c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriter( 60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const override; 66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriterEmbedded( 68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 69f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t depth, 70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 71be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong const std::string &sanitizedName, 72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const override; 79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 80bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong void emitResolveReferences( 81bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 82bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 83bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 84bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 85bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 86bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 87bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode) const override; 88bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 89bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong void emitResolveReferencesEmbedded( 90bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, 91bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong size_t depth, 92bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &name, 93bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &sanitizedName, 94bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool nameIsPointer, 95bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parcelObj, 96bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool parcelObjIsPointer, 97bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool isReader, 98bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode mode, 99bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &parentName, 100bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &offsetText) const override; 101bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 10285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaReaderWriter( 10385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 10485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &parcelObj, 10585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &argName, 10685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const override; 10785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 10885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldInitializer( 10985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, const std::string &fieldName) const override; 11085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 11185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldReaderWriter( 11285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 1134c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 114709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 11585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 11685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 11785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 11885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const override; 11985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 120368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitTypeDeclarations(Formatter& out) const override; 121fd3f250dfb0f1a990c29a76de184830e6dd9e883Timur Iskhakov void emitTypeForwardDeclaration(Formatter& out) const override; 122368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitPackageTypeDeclarations(Formatter& out) const override; 123368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitPackageHwDeclarations(Formatter& out) const override; 124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 125368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitTypeDefinitions(Formatter& out, const std::string& prefix) const override; 126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 127368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitJavaTypeDeclarations(Formatter& out, bool atTopLevel) const override; 12885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool needsEmbeddedReadWrite() const override; 1305dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool deepNeedsResolveReferences(std::unordered_set<const Type*>* visited) const override; 131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool resultNeedsDeref() const override; 132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 133368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitVtsTypeDeclarations(Formatter& out) const override; 134368e46077eb9fbe52242e037a5b9de91693fe70fSteven Moreland void emitVtsAttributeType(Formatter& out) const override; 1355158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 1365dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool deepIsJavaCompatible(std::unordered_set<const Type*>* visited) const override; 1375dc72fe4f6f1d2c03c75307a9bd80f055f752ed3Timur Iskhakov bool deepContainsPointer(std::unordered_set<const Type*>* visited) const override; 13870a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber 13985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void getAlignmentAndSize(size_t *align, size_t *size) const; 14085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 141ecfb4517ff68c59294f1ddc99513aef7b6dc2f24Howard Chen bool containsInterface() const; 142c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate: 143c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber Style mStyle; 1447fa79f6ab1ded82691094bc6337bb8be39fae58dTimur Iskhakov std::vector<NamedReference<Type>*>* mFields; 145881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 146881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitStructReaderWriter( 147881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, const std::string &prefix, bool isReader) const; 1488c90cc59bf93bd0c08970b4488067a33015d4a1cChih-Hung Hsieh void emitResolveReferenceDef(Formatter& out, const std::string& prefix, bool isReader) const; 149c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 150c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber DISALLOW_COPY_AND_ASSIGN(CompoundType); 151c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}; 152c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 153c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 154c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 155c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif // COMPOUND_TYPE_H_ 156c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 157