CompoundType.h revision f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8
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 359ed827c8cd6e8eddb1ad9987ab9413c1de8a27dfAndreas Huber CompoundType(Style style, const char *localName); 36c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 370d0f9a2e0195a8609f1939c35bd8907253b68249Andreas Huber bool setFields(std::vector<CompoundField *> *fields, std::string *errorMsg); 38c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 39f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber bool isCompoundType() const override; 40f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber 41979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string getCppType(StorageMode mode, 42979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string *extra, 43979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const override; 44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 4585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber std::string getJavaType() const override; 4685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 47881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriter( 48881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 49881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 52881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const override; 54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitReaderWriterEmbedded( 56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 57f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t depth, 58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const override; 66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 6785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaReaderWriter( 6885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 6985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &parcelObj, 7085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &argName, 7185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const override; 7285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 7385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldInitializer( 7485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, const std::string &fieldName) const override; 7585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 7685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void emitJavaFieldReaderWriter( 7785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 7885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 7985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 8085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 8185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const override; 8285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber status_t emitTypeDeclarations(Formatter &out) const override; 84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber status_t emitTypeDefinitions( 86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, const std::string prefix) const override; 87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 8885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber status_t emitJavaTypeDeclarations( 8985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, bool atTopLevel) const override; 9085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool needsEmbeddedReadWrite() const override; 92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool resultNeedsDeref() const override; 93881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 945158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang status_t emitVtsTypeDeclarations(Formatter &out) const override; 95864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang status_t emitVtsAttributeType(Formatter &out) const override; 965158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 9770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber bool isJavaCompatible() const override; 9870a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber 9985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber void getAlignmentAndSize(size_t *align, size_t *size) const; 10085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 101c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate: 102c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber Style mStyle; 103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber std::vector<CompoundField *> *mFields; 104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber void emitStructReaderWriter( 106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, const std::string &prefix, bool isReader) const; 107c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 108c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber DISALLOW_COPY_AND_ASSIGN(CompoundType); 109c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}; 110c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 11131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstruct CompoundField { 11231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber CompoundField(const char *name, Type *type); 11331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 11431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber std::string name() const; 11531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber const Type &type() const; 11631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 11731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberprivate: 11831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber std::string mName; 11931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber Type *mType; 12031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 12131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber DISALLOW_COPY_AND_ASSIGN(CompoundField); 12231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber}; 12331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber 124c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 125c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 126c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif // COMPOUND_TYPE_H_ 127c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 128