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 21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Scope.h" 22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <vector> 24c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 2731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstruct CompoundField; 28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 29c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct CompoundType : public Scope { 30c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber enum Style { 31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber STYLE_STRUCT, 32c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber STYLE_UNION, 33c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber }; 34c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 3500d1614c5ccb148e0f12f09bf90e5eb034d0e300Timur Iskhakov CompoundType(Style style, const char* localName, const Location& location, Scope* parent); 36c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 3727e85db4f2a8740d24aa5b200edc9cbd4d7de8a9Yifan Hong Style style() const; 3827e85db4f2a8740d24aa5b200edc9cbd4d7de8a9Yifan Hong 390d0f9a2e0195a8609f1939c35bd8907253b68249Andreas Huber bool setFields(std::vector<CompoundField *> *fields, std::string *errorMsg); 40c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 41f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber bool isCompoundType() const override; 42f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber 43c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong bool canCheckEquality() const override; 44c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong 458b66d53dffa4e91c932d09b8be21c8d2edc8ab78Steven Moreland std::string typeName() const override; 468b66d53dffa4e91c932d09b8be21c8d2edc8ab78Steven Moreland 47979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string getCppType(StorageMode mode, 48979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const override; 49881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 504ed1347cd29e6e07acad368891bb03078c798abaYifan Hong std::string getJavaType(bool forInitializer) const override; 5185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 52c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang std::string getVtsType() const override; 53c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriter( 55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const override; 61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriterEmbedded( 63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 64f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t depth, 65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 66be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong const std::string &sanitizedName, 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 9785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaReaderWriter( 9885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 9985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &parcelObj, 10085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &argName, 10185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const override; 10285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 10385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldInitializer( 10485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, const std::string &fieldName) const override; 10585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 10685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldReaderWriter( 10785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 1084c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t depth, 109709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 11085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 11185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 11285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 11385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const override; 11485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber status_t emitTypeDeclarations(Formatter &out) const override; 116c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong status_t emitGlobalTypeDeclarations(Formatter &out) const override; 117244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong status_t emitGlobalHwDeclarations(Formatter &out) const override; 118881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber status_t emitTypeDefinitions( 120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, const std::string prefix) const override; 121881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 12285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber status_t emitJavaTypeDeclarations( 12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, bool atTopLevel) const override; 12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool needsEmbeddedReadWrite() const override; 126bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool needsResolveReferences() const override; 127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool resultNeedsDeref() const override; 128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1295158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang status_t emitVtsTypeDeclarations(Formatter &out) const override; 130864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang status_t emitVtsAttributeType(Formatter &out) const override; 1315158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 13270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber bool isJavaCompatible() const override; 13360d3b22101e911242d2d41c8dc8309e8706f1fe1Andreas Huber bool containsPointer() const override; 13470a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber 13585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void getAlignmentAndSize(size_t *align, size_t *size) const; 13685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 137c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate: 138c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber Style mStyle; 139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber std::vector<CompoundField *> *mFields; 140881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitStructReaderWriter( 142881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, const std::string &prefix, bool isReader) const; 143bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong void emitResolveReferenceDef( 144bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &out, const std::string prefix, bool isReader) const; 145c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 146c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber DISALLOW_COPY_AND_ASSIGN(CompoundType); 147c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}; 148c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 14931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstruct CompoundField { 15031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber CompoundField(const char *name, Type *type); 15131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 15231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber std::string name() const; 15331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber const Type &type() const; 15431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 15531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberprivate: 15631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber std::string mName; 15731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber Type *mType; 15831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 15931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber DISALLOW_COPY_AND_ASSIGN(CompoundField); 16031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}; 16131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 162c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 163c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 164c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif // COMPOUND_TYPE_H_ 165c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 166