Commit 1a896822 authored by Wouter van Oortmerssen's avatar Wouter van Oortmerssen

Merge branch 'master' of https://github.com/google/flatbuffers

parents 5fd0fefa f8a964d2
...@@ -1502,7 +1502,7 @@ template<typename T> struct BufferRef : BufferRefBase { ...@@ -1502,7 +1502,7 @@ template<typename T> struct BufferRef : BufferRefBase {
bool Verify() { bool Verify() {
Verifier verifier(buf, len); Verifier verifier(buf, len);
return verifier.VerifyBuffer<T>(); return verifier.VerifyBuffer<T>(nullptr);
} }
uint8_t *buf; uint8_t *buf;
......
...@@ -105,6 +105,22 @@ inline Table *GetFieldT(const Table &table, ...@@ -105,6 +105,22 @@ inline Table *GetFieldT(const Table &table,
return table.GetPointer<Table *>(field.offset()); return table.GetPointer<Table *>(field.offset());
} }
// Get a field, if you know it's a struct.
inline const Struct *GetFieldStruct(const Table &table,
const reflection::Field &field) {
// TODO: This does NOT check if the field is a table or struct, but we'd need
// access to the schema to check the is_struct flag.
assert(field.type()->base_type() == reflection::Obj);
return table.GetStruct<const Struct *>(field.offset());
}
// Get a structure's field, if you know it's a struct.
inline const Struct *GetFieldStruct(const Struct &structure,
const reflection::Field &field) {
assert(field.type()->base_type() == reflection::Obj);
return structure.GetStruct<const Struct *>(field.offset());
}
// Raw helper functions used below: get any value in memory as a 64bit int, a // Raw helper functions used below: get any value in memory as a 64bit int, a
// double or a string. // double or a string.
// All scalars get static_cast to an int64_t, strings use strtoull, every other // All scalars get static_cast to an int64_t, strings use strtoull, every other
......
...@@ -511,6 +511,20 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) { ...@@ -511,6 +511,20 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) {
auto hp_string = flatbuffers::GetAnyFieldS(root, hp_field, &schema); auto hp_string = flatbuffers::GetAnyFieldS(root, hp_field, &schema);
TEST_EQ_STR(hp_string.c_str(), "80"); TEST_EQ_STR(hp_string.c_str(), "80");
// Get struct field through reflection
auto pos_struct = flatbuffers::GetFieldStruct(root, *pos_field_ptr);
TEST_NOTNULL(pos_struct);
TEST_EQ(flatbuffers::GetAnyFieldF(
*pos_struct, *pos_table_ptr->fields()->LookupByKey("z")), 3.0f);
auto test3_field = pos_table_ptr->fields()->LookupByKey("test3");
auto test3_struct = flatbuffers::GetFieldStruct(*pos_struct, *test3_field);
TEST_NOTNULL(test3_struct);
auto test3_object = schema.objects()->Get(test3_field->type()->index());
TEST_EQ(flatbuffers::GetAnyFieldF(
*test3_struct, *test3_object->fields()->LookupByKey("a")), 10);
// We can also modify it. // We can also modify it.
flatbuffers::SetField<uint16_t>(&root, hp_field, 200); flatbuffers::SetField<uint16_t>(&root, hp_field, 200);
hp = flatbuffers::GetFieldI<uint16_t>(root, hp_field); hp = flatbuffers::GetFieldI<uint16_t>(root, hp_field);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment