1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef VECTOR_TYPE_H_
18
19#define VECTOR_TYPE_H_
20
21#include "Type.h"
22
23namespace android {
24
25struct VectorType : public TemplatedType {
26    VectorType();
27
28    bool isVector() const override;
29    bool isVectorOfBinders() const;
30    std::string typeName() const override;
31    bool isCompatibleElementType(Type *elementType) const override;
32
33    bool canCheckEquality() const override;
34
35    void addNamedTypesToSet(std::set<const FQName> &set) const override;
36
37    std::string getCppType(
38            StorageMode mode,
39            bool specifyNamespaces) const override;
40
41    std::string getJavaType(bool forInitializer) const override;
42
43    std::string getVtsType() const override;
44    std::string getVtsValueName() const override;
45
46    void emitReaderWriter(
47            Formatter &out,
48            const std::string &name,
49            const std::string &parcelObj,
50            bool parcelObjIsPointer,
51            bool isReader,
52            ErrorMode mode) const override;
53
54    void emitReaderWriterEmbedded(
55            Formatter &out,
56            size_t depth,
57            const std::string &name,
58            const std::string &sanitizedName,
59            bool nameIsPointer,
60            const std::string &parcelObj,
61            bool parcelObjIsPointer,
62            bool isReader,
63            ErrorMode mode,
64            const std::string &parentName,
65            const std::string &offsetText) const override;
66
67    void emitResolveReferences(
68            Formatter &out,
69            const std::string &name,
70            bool nameIsPointer,
71            const std::string &parcelObj,
72            bool parcelObjIsPointer,
73            bool isReader,
74            ErrorMode mode) const override;
75
76    void emitResolveReferencesEmbedded(
77            Formatter &out,
78            size_t depth,
79            const std::string &name,
80            const std::string &sanitizedName,
81            bool nameIsPointer,
82            const std::string &parcelObj,
83            bool parcelObjIsPointer,
84            bool isReader,
85            ErrorMode mode,
86            const std::string &parentName,
87            const std::string &offsetText) const override;
88
89    bool useParentInEmitResolveReferencesEmbedded() const override;
90
91    void emitJavaReaderWriter(
92            Formatter &out,
93            const std::string &parcelObj,
94            const std::string &argName,
95            bool isReader) const override;
96
97    void emitJavaFieldInitializer(
98            Formatter &out, const std::string &fieldName) const override;
99
100    void emitJavaFieldReaderWriter(
101            Formatter &out,
102            size_t depth,
103            const std::string &parcelName,
104            const std::string &blobName,
105            const std::string &fieldName,
106            const std::string &offset,
107            bool isReader) const override;
108
109    static void EmitJavaFieldReaderWriterForElementType(
110            Formatter &out,
111            size_t depth,
112            const Type *elementType,
113            const std::string &parcelName,
114            const std::string &blobName,
115            const std::string &fieldName,
116            const std::string &offset,
117            bool isReader);
118
119    bool needsEmbeddedReadWrite() const override;
120    bool needsResolveReferences() const override;
121    bool resultNeedsDeref() const override;
122
123    bool isJavaCompatible() const override;
124    bool containsPointer() const override;
125
126    void getAlignmentAndSize(size_t *align, size_t *size) const override;
127    static void getAlignmentAndSizeStatic(size_t *align, size_t *size);
128 private:
129    // Helper method for emitResolveReferences[Embedded].
130    // Pass empty childName and childOffsetText if the original
131    // childHandle is unknown.
132    // For example, given a vec<ref<T>> (T is a simple struct that
133    // contains primitive values only), then the following methods are
134    // invoked:
135    // 1. VectorType::emitResolveReferences
136    //    ... which calls the helper with empty childName and childOffsetText
137    // 2. RefType::emitResolveReferencesEmbedded
138    void emitResolveReferencesEmbeddedHelper(
139            Formatter &out,
140            size_t depth,
141            const std::string &name,
142            const std::string &sanitizedName,
143            bool nameIsPointer,
144            const std::string &parcelObj,
145            bool parcelObjIsPointer,
146            bool isReader,
147            ErrorMode mode,
148            const std::string &childName,
149            const std::string &childOffsetText) const;
150
151    void emitReaderWriterForVectorOfBinders(
152            Formatter &out,
153            const std::string &name,
154            const std::string &parcelObj,
155            bool parcelObjIsPointer,
156            bool isReader,
157            ErrorMode mode) const;
158
159    DISALLOW_COPY_AND_ASSIGN(VectorType);
160};
161
162}  // namespace android
163
164#endif  // VECTOR_TYPE_H_
165
166