| 3992 | } |
| 3993 | |
| 3994 | bool StructDef::Deserialize(Parser &parser, const reflection::Object *object) { |
| 3995 | if (!DeserializeAttributes(parser, object->attributes())) return false; |
| 3996 | DeserializeDoc(doc_comment, object->documentation()); |
| 3997 | name = parser.UnqualifiedName(object->name()->str()); |
| 3998 | predecl = false; |
| 3999 | sortbysize = attributes.Lookup("original_order") == nullptr && !fixed; |
| 4000 | const auto &of = *(object->fields()); |
| 4001 | auto indexes = std::vector<uoffset_t>(of.size()); |
| 4002 | for (uoffset_t i = 0; i < of.size(); i++) indexes[of.Get(i)->id()] = i; |
| 4003 | size_t tmp_struct_size = 0; |
| 4004 | for (size_t i = 0; i < indexes.size(); i++) { |
| 4005 | auto field = of.Get(indexes[i]); |
| 4006 | auto field_def = new FieldDef(); |
| 4007 | if (!field_def->Deserialize(parser, field) || |
| 4008 | fields.Add(field_def->name, field_def)) { |
| 4009 | delete field_def; |
| 4010 | return false; |
| 4011 | } |
| 4012 | if (field_def->key) { |
| 4013 | if (has_key) { |
| 4014 | // only one field may be set as key |
| 4015 | delete field_def; |
| 4016 | return false; |
| 4017 | } |
| 4018 | has_key = true; |
| 4019 | } |
| 4020 | if (fixed) { |
| 4021 | // Recompute padding since that's currently not serialized. |
| 4022 | auto size = InlineSize(field_def->value.type); |
| 4023 | auto next_field = |
| 4024 | i + 1 < indexes.size() ? of.Get(indexes[i + 1]) : nullptr; |
| 4025 | tmp_struct_size += size; |
| 4026 | field_def->padding = |
| 4027 | next_field ? (next_field->offset() - field_def->value.offset) - size |
| 4028 | : PaddingBytes(tmp_struct_size, minalign); |
| 4029 | tmp_struct_size += field_def->padding; |
| 4030 | } |
| 4031 | } |
| 4032 | FLATBUFFERS_ASSERT(static_cast<int>(tmp_struct_size) == object->bytesize()); |
| 4033 | return true; |
| 4034 | } |
| 4035 | |
| 4036 | Offset<reflection::Field> FieldDef::Serialize(FlatBufferBuilder *builder, |
| 4037 | uint16_t id, |
no test coverage detected