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