| 1699 | } |
| 1700 | |
| 1701 | CheckedError Parser::ParseVector(const Type &vector_type, uoffset_t *ovalue, |
| 1702 | FieldDef *field, size_t fieldn) { |
| 1703 | Type type = vector_type.VectorType(); |
| 1704 | size_t count = 0; |
| 1705 | auto err = ParseVectorDelimiters(count, [&](size_t &) -> CheckedError { |
| 1706 | Value val; |
| 1707 | val.type = type; |
| 1708 | ECHECK(ParseAnyValue(val, field, fieldn, nullptr, count, true)); |
| 1709 | field_stack_.push_back(std::make_pair(val, nullptr)); |
| 1710 | return NoError(); |
| 1711 | }); |
| 1712 | ECHECK(err); |
| 1713 | |
| 1714 | const size_t alignment = InlineAlignment(type); |
| 1715 | const size_t len = count * InlineSize(type) / InlineAlignment(type); |
| 1716 | const size_t elemsize = InlineAlignment(type); |
| 1717 | const auto force_align = field->attributes.Lookup("force_align"); |
| 1718 | if (force_align) { |
| 1719 | size_t align; |
| 1720 | ECHECK(ParseAlignAttribute(force_align->constant, 1, &align)); |
| 1721 | if (align > 1) { builder_.ForceVectorAlignment(len, elemsize, align); } |
| 1722 | } |
| 1723 | |
| 1724 | // TODO Fix using element alignment as size (`elemsize`)! |
| 1725 | if (vector_type.base_type == BASE_TYPE_VECTOR64) { |
| 1726 | // TODO(derekbailey): this requires a 64-bit builder. |
| 1727 | // builder_.StartVector<Offset64, uoffset64_t>(len, elemsize, alignment); |
| 1728 | builder_.StartVector(len, elemsize, alignment); |
| 1729 | } else { |
| 1730 | builder_.StartVector(len, elemsize, alignment); |
| 1731 | } |
| 1732 | for (size_t i = 0; i < count; i++) { |
| 1733 | // start at the back, since we're building the data backwards. |
| 1734 | auto &val = field_stack_.back().first; |
| 1735 | switch (val.type.base_type) { |
| 1736 | // clang-format off |
| 1737 | #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE,...) \ |
| 1738 | case BASE_TYPE_ ## ENUM: \ |
| 1739 | if (IsStruct(val.type)) SerializeStruct(*val.type.struct_def, val); \ |
| 1740 | else { \ |
| 1741 | CTYPE elem; \ |
| 1742 | ECHECK(atot(val.constant.c_str(), *this, &elem)); \ |
| 1743 | builder_.PushElement(elem); \ |
| 1744 | } \ |
| 1745 | break; |
| 1746 | FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) |
| 1747 | #undef FLATBUFFERS_TD |
| 1748 | // clang-format on |
| 1749 | } |
| 1750 | field_stack_.pop_back(); |
| 1751 | } |
| 1752 | |
| 1753 | builder_.ClearOffsets(); |
| 1754 | if (vector_type.base_type == BASE_TYPE_VECTOR64) { |
| 1755 | *ovalue = builder_.EndVector<uoffset64_t>(count); |
| 1756 | } else { |
| 1757 | *ovalue = builder_.EndVector(count); |
| 1758 | } |
nothing calls this directly
no test coverage detected