blob: d7eb5816812e5cc9a27dfe52bcb6fc9373149355 [file] [log] [blame]
Andreas Huber1aec3972016-08-26 09:26:32 -07001/*
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
Andreas Huberc9410c72016-07-28 12:18:40 -070017#include "VectorType.h"
18
Andreas Huberf03332a2016-09-22 15:35:43 -070019#include "ArrayType.h"
20
Iliyan Malcheva72e0d22016-09-09 11:03:08 -070021#include <hidl-util/Formatter.h>
Andreas Huber881227d2016-08-02 14:20:21 -070022#include <android-base/logging.h>
23
Andreas Huberc9410c72016-07-28 12:18:40 -070024namespace android {
25
Yifan Hongbf459bc2016-08-23 16:50:37 -070026VectorType::VectorType() {
Andreas Huberc9410c72016-07-28 12:18:40 -070027}
28
Steven Moreland979e0992016-09-07 09:18:08 -070029void VectorType::addNamedTypesToSet(std::set<const FQName> &set) const {
30 mElementType->addNamedTypesToSet(set);
31}
32
33std::string VectorType::getCppType(StorageMode mode,
34 std::string *extra,
35 bool specifyNamespaces) const {
Yifan Hongbf459bc2016-08-23 16:50:37 -070036 std::string elementExtra;
37 const std::string elementBase = mElementType->getCppType(&elementExtra, specifyNamespaces);
38
Andreas Huber881227d2016-08-02 14:20:21 -070039 const std::string base =
Steven Moreland979e0992016-09-07 09:18:08 -070040 std::string(specifyNamespaces ? "::android::hardware::" : "")
41 + "hidl_vec<"
42 + mElementType->getCppType(extra, specifyNamespaces)
Andreas Huberf9d49f12016-09-12 14:58:36 -070043 + (*extra)
Andreas Huber881227d2016-08-02 14:20:21 -070044 + ">";
45
Andreas Huberf9d49f12016-09-12 14:58:36 -070046 extra->clear();
Andreas Huber881227d2016-08-02 14:20:21 -070047
48 switch (mode) {
49 case StorageMode_Stack:
50 return base;
51
52 case StorageMode_Argument:
53 return "const " + base + "&";
54
55 case StorageMode_Result:
56 return "const " + base + "*";
57 }
58}
59
Andreas Huber4c865b72016-09-14 15:26:27 -070060std::string VectorType::getJavaType(
61 std::string *extra, bool /* forInitializer */) const {
Andreas Huber1b6822b2016-10-18 09:28:40 -070062 extra->clear();
Andreas Huber4c865b72016-09-14 15:26:27 -070063
64 std::string elementExtra;
Andreas Huber1b6822b2016-10-18 09:28:40 -070065 std::string elementJavaType = mElementType->getJavaType(&elementExtra);
66
67 CHECK(mElementType->isArray() || elementExtra.empty());
68
69 return "ArrayList<"
70 + (mElementType->isArray()
71 ? elementJavaType : mElementType->getJavaWrapperType())
72 + elementExtra
73 + ">";
Andreas Huber2831d512016-08-15 09:33:47 -070074}
75
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -070076std::string VectorType::getVtsType() const {
77 return "TYPE_VECTOR";
78}
79
Andreas Huber881227d2016-08-02 14:20:21 -070080void VectorType::emitReaderWriter(
81 Formatter &out,
82 const std::string &name,
83 const std::string &parcelObj,
84 bool parcelObjIsPointer,
85 bool isReader,
86 ErrorMode mode) const {
87 std::string baseExtra;
88 std::string baseType = mElementType->getCppType(&baseExtra);
89
Iliyan Malchev549e2592016-08-10 08:59:12 -070090 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -070091
92 out << "size_t " << parentName << ";\n\n";
93
94 const std::string parcelObjDeref =
95 parcelObj + (parcelObjIsPointer ? "->" : ".");
96
97 if (isReader) {
98 out << name
Andreas Huber8a82ff72016-08-04 10:29:39 -070099 << " = (const ::android::hardware::hidl_vec<"
Andreas Huber881227d2016-08-02 14:20:21 -0700100 << baseType
Andreas Huberf9d49f12016-09-12 14:58:36 -0700101 << baseExtra
Andreas Huber881227d2016-08-02 14:20:21 -0700102 << "> *)"
103 << parcelObjDeref
104 << "readBuffer(&"
105 << parentName
106 << ");\n\n";
107
108 out << "if (" << name << " == nullptr) {\n";
109
110 out.indent();
111
Iliyan Malchev549e2592016-08-10 08:59:12 -0700112 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700113 handleError2(out, mode);
114
115 out.unindent();
116 out << "}\n\n";
117 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700118 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -0700119 << parcelObjDeref
120 << "writeBuffer(&"
121 << name
122 << ", sizeof("
123 << name
124 << "), &"
125 << parentName
126 << ");\n";
127
128 handleError(out, mode);
129 }
130
131 emitReaderWriterEmbedded(
132 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700133 0 /* depth */,
Andreas Huber881227d2016-08-02 14:20:21 -0700134 name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700135 name /* sanitizedName */ ,
Andreas Huber881227d2016-08-02 14:20:21 -0700136 isReader /* nameIsPointer */,
137 parcelObj,
138 parcelObjIsPointer,
139 isReader,
140 mode,
141 parentName,
142 "0 /* parentOffset */");
143}
144
145void VectorType::emitReaderWriterEmbedded(
146 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700147 size_t depth,
Andreas Huber881227d2016-08-02 14:20:21 -0700148 const std::string &name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700149 const std::string &sanitizedName,
Andreas Huber881227d2016-08-02 14:20:21 -0700150 bool nameIsPointer,
151 const std::string &parcelObj,
152 bool parcelObjIsPointer,
153 bool isReader,
154 ErrorMode mode,
155 const std::string &parentName,
156 const std::string &offsetText) const {
157 std::string baseExtra;
158 std::string baseType = Type::getCppType(&baseExtra);
159
Yifan Hongbe2a3732016-10-05 13:33:41 -0700160 const std::string childName = "_hidl_" + sanitizedName + "_child";
Andreas Huber881227d2016-08-02 14:20:21 -0700161 out << "size_t " << childName << ";\n\n";
162
163 emitReaderWriterEmbeddedForTypeName(
164 out,
165 name,
166 nameIsPointer,
167 parcelObj,
168 parcelObjIsPointer,
169 isReader,
170 mode,
171 parentName,
172 offsetText,
173 baseType,
174 childName);
175
176 if (!mElementType->needsEmbeddedReadWrite()) {
177 return;
178 }
179
180 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
181
182 baseType = mElementType->getCppType(&baseExtra);
183
Andreas Huberf9d49f12016-09-12 14:58:36 -0700184 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
185
186 out << "for (size_t "
187 << iteratorName
188 << " = 0; "
189 << iteratorName
190 << " < "
Andreas Huber881227d2016-08-02 14:20:21 -0700191 << nameDeref
Andreas Huberf9d49f12016-09-12 14:58:36 -0700192 << "size(); ++"
193 << iteratorName
194 << ") {\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700195
196 out.indent();
197
198 mElementType->emitReaderWriterEmbedded(
199 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700200 depth + 1,
201 (nameIsPointer ? "(*" + name + ")" : name)
202 + "[" + iteratorName + "]",
Yifan Hongbe2a3732016-10-05 13:33:41 -0700203 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
Andreas Huber881227d2016-08-02 14:20:21 -0700204 false /* nameIsPointer */,
205 parcelObj,
206 parcelObjIsPointer,
207 isReader,
208 mode,
209 childName,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700210 iteratorName + " * sizeof(" + baseType + baseExtra + ")");
Andreas Huber881227d2016-08-02 14:20:21 -0700211
212 out.unindent();
213
214 out << "}\n\n";
215}
216
Yifan Hongbf459bc2016-08-23 16:50:37 -0700217void VectorType::emitResolveReferences(
218 Formatter &out,
219 const std::string &name,
220 bool nameIsPointer,
221 const std::string &parcelObj,
222 bool parcelObjIsPointer,
223 bool isReader,
224 ErrorMode mode) const {
225 emitResolveReferencesEmbeddedHelper(
226 out,
227 0, /* depth */
228 name,
229 name /* sanitizedName */,
230 nameIsPointer,
231 parcelObj,
232 parcelObjIsPointer,
233 isReader,
234 mode,
235 "_hidl_" + name + "_child",
236 "0 /* parentOffset */");
237}
238
239void VectorType::emitResolveReferencesEmbedded(
240 Formatter &out,
241 size_t depth,
242 const std::string &name,
243 const std::string &sanitizedName,
244 bool nameIsPointer,
245 const std::string &parcelObj,
246 bool parcelObjIsPointer,
247 bool isReader,
248 ErrorMode mode,
249 const std::string & /* parentName */,
250 const std::string & /* offsetText */) const {
251 emitResolveReferencesEmbeddedHelper(
252 out, depth, name, sanitizedName, nameIsPointer, parcelObj,
253 parcelObjIsPointer, isReader, mode, "", "");
254}
255
Yifan Hong00f47172016-09-30 14:40:45 -0700256bool VectorType::useParentInEmitResolveReferencesEmbedded() const {
257 // parentName and offsetText is not used in emitResolveReferencesEmbedded
258 return false;
259}
260
Yifan Hongbf459bc2016-08-23 16:50:37 -0700261void VectorType::emitResolveReferencesEmbeddedHelper(
262 Formatter &out,
263 size_t depth,
264 const std::string &name,
265 const std::string &sanitizedName,
266 bool nameIsPointer,
267 const std::string &parcelObj,
268 bool parcelObjIsPointer,
269 bool isReader,
270 ErrorMode mode,
271 const std::string &childName,
272 const std::string &childOffsetText) const {
273 CHECK(needsResolveReferences() && mElementType->needsResolveReferences());
274
275 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
276 std::string elementExtra;
277 std::string elementType = mElementType->getCppType(&elementExtra);
278
279 std::string myChildName = childName, myChildOffset = childOffsetText;
280
281 if(myChildName.empty() && myChildOffset.empty()) {
282 myChildName = "_hidl_" + sanitizedName + "_child";
283 myChildOffset = "0";
284
285 out << "size_t " << myChildName << ";\n";
286 out << "_hidl_err = " << nameDeref << "findInParcel("
287 << (parcelObjIsPointer ? "*" : "") << parcelObj << ", "
288 << "&" << myChildName
289 << ");\n";
290
291 handleError(out, mode);
292 }
293
294 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
295
296 out << "for (size_t "
297 << iteratorName
298 << " = 0; "
299 << iteratorName
300 << " < "
301 << nameDeref
302 << "size(); ++"
303 << iteratorName
304 << ") {\n";
305
306 out.indent();
307
308 mElementType->emitResolveReferencesEmbedded(
309 out,
310 depth + 1,
311 (nameIsPointer ? "(*" + name + ")" : name) + "[" + iteratorName + "]",
312 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
313 false /* nameIsPointer */,
314 parcelObj,
315 parcelObjIsPointer,
316 isReader,
317 mode,
318 myChildName,
319 myChildOffset + " + " +
320 iteratorName + " * sizeof(" + elementType + elementExtra + ")");
321
322 out.unindent();
323
324 out << "}\n\n";
325}
326
Andreas Huberf630bc82016-09-09 14:52:25 -0700327void VectorType::emitJavaReaderWriter(
328 Formatter &out,
329 const std::string &parcelObj,
330 const std::string &argName,
331 bool isReader) const {
332 if (mElementType->isCompoundType()) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700333 std::string extra; // unused, because CompoundType leaves this empty.
334
Andreas Huberf630bc82016-09-09 14:52:25 -0700335 if (isReader) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700336 out << mElementType->getJavaType(&extra)
Andreas Huberf630bc82016-09-09 14:52:25 -0700337 << ".readVectorFromParcel("
338 << parcelObj
339 << ");\n";
340 } else {
Andreas Huber4c865b72016-09-14 15:26:27 -0700341 out << mElementType->getJavaType(&extra)
Andreas Huberf630bc82016-09-09 14:52:25 -0700342 << ".writeVectorToParcel("
343 << parcelObj
344 << ", "
345 << argName
346 << ");\n";
347 }
348
349 return;
350 }
351
Andreas Huber1b6822b2016-10-18 09:28:40 -0700352 if (mElementType->isArray()) {
353 if (isReader) {
354 std::string extra;
355 out << " new "
356 << getJavaType(&extra, false /* forInitializer */)
357 << "();\n";
358 }
359
360 out << "{\n";
361 out.indent();
362
363 out << "HwBlob _hidl_blob = ";
364
365 if (isReader) {
366 out << parcelObj
367 << ".readBuffer();\n";
368 } else {
369 size_t align, size;
370 getAlignmentAndSize(&align, &size);
371
372 out << "new HwBlob("
373 << size
374 << " /* size */);\n";
375 }
376
377 emitJavaFieldReaderWriter(
378 out,
379 0 /* depth */,
380 parcelObj,
381 "_hidl_blob",
382 argName,
383 "0 /* offset */",
384 isReader);
385
386 if (!isReader) {
387 out << parcelObj << ".writeBuffer(_hidl_blob);\n";
388 };
389
390 out.unindent();
391 out << "}\n";
392
393 return;
394 }
395
Andreas Huberf630bc82016-09-09 14:52:25 -0700396 emitJavaReaderWriterWithSuffix(
397 out,
398 parcelObj,
399 argName,
400 isReader,
401 mElementType->getJavaSuffix() + "Vector",
402 "" /* extra */);
403}
404
Andreas Huber85eabdb2016-08-25 11:24:49 -0700405void VectorType::emitJavaFieldInitializer(
406 Formatter &out, const std::string &fieldName) const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700407 std::string extra;
Andreas Huber1b6822b2016-10-18 09:28:40 -0700408 std::string javaType = getJavaType(&extra, false /* forInitializer */);
Andreas Huberf03332a2016-09-22 15:35:43 -0700409
Andreas Huber1b6822b2016-10-18 09:28:40 -0700410 out << "final "
411 << javaType
412 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700413 << fieldName
Andreas Huber1b6822b2016-10-18 09:28:40 -0700414 << " = new "
415 << javaType
416 << "();\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700417}
418
419void VectorType::emitJavaFieldReaderWriter(
420 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700421 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700422 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700423 const std::string &blobName,
424 const std::string &fieldName,
425 const std::string &offset,
426 bool isReader) const {
Andreas Huberf630bc82016-09-09 14:52:25 -0700427 VectorType::EmitJavaFieldReaderWriterForElementType(
Andreas Huber709b62d2016-09-19 11:21:18 -0700428 out,
429 depth,
430 mElementType,
431 parcelName,
432 blobName,
433 fieldName,
434 offset,
435 isReader);
Andreas Huberf630bc82016-09-09 14:52:25 -0700436}
437
438// static
439void VectorType::EmitJavaFieldReaderWriterForElementType(
440 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700441 size_t depth,
Andreas Huberf630bc82016-09-09 14:52:25 -0700442 const Type *elementType,
Andreas Huber709b62d2016-09-19 11:21:18 -0700443 const std::string &parcelName,
Andreas Huberf630bc82016-09-09 14:52:25 -0700444 const std::string &blobName,
445 const std::string &fieldName,
446 const std::string &offset,
447 bool isReader) {
Andreas Huber85eabdb2016-08-25 11:24:49 -0700448 if (isReader) {
449 out << "{\n";
450 out.indent();
451
Andreas Huber709b62d2016-09-19 11:21:18 -0700452 out << "HwBlob childBlob = "
453 << parcelName
454 << ".readEmbeddedBuffer(\n";
455
Andreas Huber85eabdb2016-08-25 11:24:49 -0700456 out.indent();
457 out.indent();
458
459 out << blobName
460 << ".handle(),\n"
461 << offset
462 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */);\n\n";
463
464 out.unindent();
465 out.unindent();
466
467 out << fieldName << ".clear();\n";
468 out << "long _hidl_vec_size = "
469 << blobName
470 << ".getInt64("
471 << offset
472 << " + 8 /* offsetof(hidl_vec<T>, mSize) */);\n";
473
Andreas Huber4c865b72016-09-14 15:26:27 -0700474 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
475
476 out << "for (int "
477 << iteratorName
478 << " = 0; "
479 << iteratorName
480 << " < _hidl_vec_size; "
481 << "++"
482 << iteratorName
483 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700484
485 out.indent();
486
Andreas Huberf630bc82016-09-09 14:52:25 -0700487 elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
Andreas Huber85eabdb2016-08-25 11:24:49 -0700488
489 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700490 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700491
Andreas Huberf630bc82016-09-09 14:52:25 -0700492 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700493 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700494 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700495 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700496 "childBlob",
497 "_hidl_vec_element",
Andreas Huber4c865b72016-09-14 15:26:27 -0700498 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700499 true /* isReader */);
500
Andreas Huber1b6822b2016-10-18 09:28:40 -0700501 out << fieldName
502 << ".add(_hidl_vec_element);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700503
504 out.unindent();
505
506 out << "}\n";
507
508 out.unindent();
509 out << "}\n";
510
511 return;
512 }
513
514 out << "{\n";
515 out.indent();
516
517 out << "long _hidl_vec_size = "
518 << fieldName
519 << ".size();\n";
520
521 out << blobName
522 << ".putInt64("
523 << offset
524 << " + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);\n";
525
526 out << blobName
527 << ".putBool("
528 << offset
529 << " + 16 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
530
531 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700532 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700533
534 // XXX make HwBlob constructor take a long instead of an int?
535 out << "HwBlob childBlob = new HwBlob((int)(_hidl_vec_size * "
536 << elementSize
537 << "));\n";
538
Andreas Huber4c865b72016-09-14 15:26:27 -0700539 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
540
541 out << "for (int "
542 << iteratorName
543 << " = 0; "
544 << iteratorName
545 << " < _hidl_vec_size; "
546 << "++"
547 << iteratorName
548 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700549
550 out.indent();
551
Andreas Huberf630bc82016-09-09 14:52:25 -0700552 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700553 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700554 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700555 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700556 "childBlob",
Andreas Huberf1abc2a2016-09-28 09:14:43 -0700557 fieldName + ".get(" + iteratorName + ")",
Andreas Huber4c865b72016-09-14 15:26:27 -0700558 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700559 false /* isReader */);
560
561 out.unindent();
562
563 out << "}\n";
564
565 out << blobName
566 << ".putBlob("
567 << offset
568 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);\n";
569
570 out.unindent();
571 out << "}\n";
572}
573
Andreas Huber881227d2016-08-02 14:20:21 -0700574bool VectorType::needsEmbeddedReadWrite() const {
575 return true;
576}
577
Yifan Hongbf459bc2016-08-23 16:50:37 -0700578bool VectorType::needsResolveReferences() const {
579 return mElementType->needsResolveReferences();
580}
581
Andreas Huber881227d2016-08-02 14:20:21 -0700582bool VectorType::resultNeedsDeref() const {
583 return true;
584}
585
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700586status_t VectorType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700587 out << "type: " << getVtsType() << "\n";
588 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700589 out.indent();
590 status_t err = mElementType->emitVtsTypeDeclarations(out);
591 if (err != OK) {
592 return err;
593 }
594 out.unindent();
595 out << "}\n";
596 return OK;
597}
598
Zhuoyao Zhang864c7712016-08-16 15:35:28 -0700599status_t VectorType::emitVtsAttributeType(Formatter &out) const {
600 out << "type: TYPE_VECTOR\n" << "vector_value: {\n";
601 out.indent();
602 status_t status = mElementType->emitVtsAttributeType(out);
603 if (status != OK) {
604 return status;
605 }
606 out.unindent();
607 out << "}\n";
608 return OK;
609}
610
Andreas Huber70a59e12016-08-16 12:57:01 -0700611bool VectorType::isJavaCompatible() const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700612 if (!mElementType->isJavaCompatible()) {
613 return false;
614 }
615
616 if (mElementType->isArray()) {
617 return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
618 }
619
Andreas Huber1b6822b2016-10-18 09:28:40 -0700620 if (mElementType->isVector()) {
621 return false;
622 }
623
Andreas Huberf03332a2016-09-22 15:35:43 -0700624 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700625}
626
Andreas Huber85eabdb2016-08-25 11:24:49 -0700627void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
628 *align = 8; // hidl_vec<T>
629 *size = 24;
630}
631
Andreas Huberc9410c72016-07-28 12:18:40 -0700632} // namespace android
633