| 374 | } |
| 375 | |
| 376 | Offset<const Table *> CopyTable(FlatBufferBuilder &fbb, |
| 377 | const reflection::Schema &schema, |
| 378 | const reflection::Object &objectdef, |
| 379 | const Table &table, bool use_string_pooling) { |
| 380 | // Before we can construct the table, we have to first generate any |
| 381 | // subobjects, and collect their offsets. |
| 382 | std::vector<uoffset_t> offsets; |
| 383 | auto fielddefs = objectdef.fields(); |
| 384 | for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) { |
| 385 | auto &fielddef = **it; |
| 386 | // Skip if field is not present in the source. |
| 387 | if (!table.CheckField(fielddef.offset())) continue; |
| 388 | uoffset_t offset = 0; |
| 389 | switch (fielddef.type()->base_type()) { |
| 390 | case reflection::String: { |
| 391 | offset = use_string_pooling |
| 392 | ? fbb.CreateSharedString(GetFieldS(table, fielddef)).o |
| 393 | : fbb.CreateString(GetFieldS(table, fielddef)).o; |
| 394 | break; |
| 395 | } |
| 396 | case reflection::Obj: { |
| 397 | auto &subobjectdef = *schema.objects()->Get(fielddef.type()->index()); |
| 398 | if (!subobjectdef.is_struct()) { |
| 399 | offset = CopyTable(fbb, schema, subobjectdef, |
| 400 | *GetFieldT(table, fielddef), use_string_pooling) |
| 401 | .o; |
| 402 | } |
| 403 | break; |
| 404 | } |
| 405 | case reflection::Union: { |
| 406 | auto &subobjectdef = GetUnionType(schema, objectdef, fielddef, table); |
| 407 | offset = CopyTable(fbb, schema, subobjectdef, |
| 408 | *GetFieldT(table, fielddef), use_string_pooling) |
| 409 | .o; |
| 410 | break; |
| 411 | } |
| 412 | case reflection::Vector: { |
| 413 | auto vec = |
| 414 | table.GetPointer<const Vector<Offset<Table>> *>(fielddef.offset()); |
| 415 | auto element_base_type = fielddef.type()->element(); |
| 416 | auto elemobjectdef = |
| 417 | element_base_type == reflection::Obj |
| 418 | ? schema.objects()->Get(fielddef.type()->index()) |
| 419 | : nullptr; |
| 420 | switch (element_base_type) { |
| 421 | case reflection::String: { |
| 422 | std::vector<Offset<const String *>> elements(vec->size()); |
| 423 | auto vec_s = reinterpret_cast<const Vector<Offset<String>> *>(vec); |
| 424 | for (uoffset_t i = 0; i < vec_s->size(); i++) { |
| 425 | elements[i] = use_string_pooling |
| 426 | ? fbb.CreateSharedString(vec_s->Get(i)).o |
| 427 | : fbb.CreateString(vec_s->Get(i)).o; |
| 428 | } |
| 429 | offset = fbb.CreateVector(elements).o; |
| 430 | break; |
| 431 | } |
| 432 | case reflection::Obj: { |
| 433 | if (!elemobjectdef->is_struct()) { |
nothing calls this directly
no test coverage detected