| 3563 | } |
| 3564 | |
| 3565 | bool StructDef::Deserialize(Parser &parser, const reflection::Object *object) { |
| 3566 | if (!DeserializeAttributes(parser, object->attributes())) return false; |
| 3567 | DeserializeDoc(doc_comment, object->documentation()); |
| 3568 | name = parser.UnqualifiedName(object->name()->str()); |
| 3569 | predecl = false; |
| 3570 | sortbysize = attributes.Lookup("original_order") == nullptr && !fixed; |
| 3571 | const auto &of = *(object->fields()); |
| 3572 | auto indexes = std::vector<uoffset_t>(of.size()); |
| 3573 | for (uoffset_t i = 0; i < of.size(); i++) indexes[of.Get(i)->id()] = i; |
| 3574 | size_t tmp_struct_size = 0; |
| 3575 | for (size_t i = 0; i < indexes.size(); i++) { |
| 3576 | auto field = of.Get(indexes[i]); |
| 3577 | auto field_def = new FieldDef(); |
| 3578 | if (!field_def->Deserialize(parser, field) || |
| 3579 | fields.Add(field_def->name, field_def)) { |
| 3580 | delete field_def; |
| 3581 | return false; |
| 3582 | } |
| 3583 | if (fixed) { |
| 3584 | // Recompute padding since that's currently not serialized. |
| 3585 | auto size = InlineSize(field_def->value.type); |
| 3586 | auto next_field = |
| 3587 | i + 1 < indexes.size() ? of.Get(indexes[i + 1]) : nullptr; |
| 3588 | tmp_struct_size += size; |
| 3589 | field_def->padding = |
| 3590 | next_field ? (next_field->offset() - field_def->value.offset) - size |
| 3591 | : PaddingBytes(tmp_struct_size, minalign); |
| 3592 | tmp_struct_size += field_def->padding; |
| 3593 | } |
| 3594 | } |
| 3595 | FLATBUFFERS_ASSERT(static_cast<int>(tmp_struct_size) == object->bytesize()); |
| 3596 | return true; |
| 3597 | } |
| 3598 | |
| 3599 | Offset<reflection::Field> FieldDef::Serialize(FlatBufferBuilder *builder, |
| 3600 | uint16_t id, |
no test coverage detected