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