CompoundType.h revision 4ed1347cd29e6e07acad368891bb03078c798aba
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
35a4b53d0da8c1c6889c361fd30b913adc364163bcYifan Hong    CompoundType(Style style, const char *localName, const Location &location);
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                           bool specifyNamespaces) const override;
43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
444ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    std::string getJavaType(bool forInitializer) const override;
4585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
46c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    std::string getVtsType() const override;
47c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
48881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriter(
49881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
52881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const override;
55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriterEmbedded(
57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
58f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber            size_t depth,
59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
60be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong            const std::string &sanitizedName,
61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool nameIsPointer,
62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode,
66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parentName,
67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &offsetText) const override;
68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
69bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    void emitResolveReferences(
70bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
71bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
72bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
73bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
74bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
75bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
76bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode) const override;
77bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
78bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    void emitResolveReferencesEmbedded(
79bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            Formatter &out,
80bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            size_t depth,
81bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &name,
82bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &sanitizedName,
83bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool nameIsPointer,
84bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parcelObj,
85bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool parcelObjIsPointer,
86bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            bool isReader,
87bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            ErrorMode mode,
88bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &parentName,
89bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            const std::string &offsetText) const override;
90bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
9185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    void emitJavaReaderWriter(
9285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
9385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &parcelObj,
9485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &argName,
9585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            bool isReader) const override;
9685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
9785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    void emitJavaFieldInitializer(
9885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, const std::string &fieldName) const override;
9985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
10085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    void emitJavaFieldReaderWriter(
10185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out,
1024c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            size_t depth,
103709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            const std::string &parcelName,
10485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &blobName,
10585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &fieldName,
10685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            const std::string &offset,
10785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            bool isReader) const override;
10885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    status_t emitTypeDeclarations(Formatter &out) const override;
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    status_t emitTypeDefinitions(
112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out, const std::string prefix) const override;
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
11485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    status_t emitJavaTypeDeclarations(
11585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            Formatter &out, bool atTopLevel) const override;
11685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
117881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    bool needsEmbeddedReadWrite() const override;
118bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    bool needsResolveReferences() const override;
119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    bool resultNeedsDeref() const override;
120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    status_t emitVtsTypeDeclarations(Formatter &out) const override;
122864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    status_t emitVtsAttributeType(Formatter &out) const override;
1235158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
12470a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    bool isJavaCompatible() const override;
12570a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
12685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    void getAlignmentAndSize(size_t *align, size_t *size) const;
12785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
128c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate:
129c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    Style mStyle;
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    std::vector<CompoundField *> *mFields;
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitStructReaderWriter(
133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out, const std::string &prefix, bool isReader) const;
134bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    void emitResolveReferenceDef(
135bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &out, const std::string prefix, bool isReader) const;
136c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
137c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(CompoundType);
138c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
139c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
14031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberstruct CompoundField {
14131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    CompoundField(const char *name, Type *type);
14231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
14331629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    std::string name() const;
14431629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    const Type &type() const;
14531629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
14631629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huberprivate:
14731629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    std::string mName;
14831629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    Type *mType;
14931629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
15031629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber    DISALLOW_COPY_AND_ASSIGN(CompoundField);
15131629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber};
15231629bcd51ab30bc0aadc69f3fc8ce4893eca900Andreas Huber
153c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
154c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
155c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // COMPOUND_TYPE_H_
156c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
157