MCPcopy Create free account
hub / github.com/catboost/catboost / ParseVector

Method ParseVector

contrib/libs/flatbuffers/src/idl_parser.cpp:1701–1819  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1699}
1700
1701CheckedError 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 }

Callers

nothing calls this directly

Calls 15

NoErrorFunction · 0.85
InlineAlignmentFunction · 0.85
InlineSizeFunction · 0.85
CompareSerializedScalarsFunction · 0.85
CompareTablesByStringKeyFunction · 0.85
CompareTablesByScalarKeyFunction · 0.85
ForceVectorAlignmentMethod · 0.80
StartVectorMethod · 0.80
ClearOffsetsMethod · 0.80
EndVectorMethod · 0.80
swapFunction · 0.50

Tested by

no test coverage detected