From 6e160f4c5963c33cabc975edaf8b4212aba7da72 Mon Sep 17 00:00:00 2001 From: Jon Simantov Date: Wed, 22 Jul 2015 10:56:41 -0700 Subject: [PATCH] Use Object* for optional root_table in SetString/ResizeVector. Was previously using table name, but no reason not to just let the calling code worry about getting the object. --- include/flatbuffers/reflection.h | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/include/flatbuffers/reflection.h b/include/flatbuffers/reflection.h index e376037..66352a8 100644 --- a/include/flatbuffers/reflection.h +++ b/include/flatbuffers/reflection.h @@ -272,12 +272,12 @@ inline const reflection::Object &GetUnionType( // Unless "delta" is a multiple of the largest alignment, you'll create a small // amount of garbage space in the buffer (usually 0..7 bytes). // If your FlatBuffer's root table is not the schema's root table, you should -// pass in the name of the root table in root_table_name. +// pass in your root_table type as well. class ResizeContext { public: ResizeContext(const reflection::Schema &schema, uoffset_t start, int delta, std::vector *flatbuf, - const char* root_table_name = nullptr) + const reflection::Object* root_table = nullptr) : schema_(schema), startptr_(flatbuf->data() + start), delta_(delta), buf_(*flatbuf), dag_check_(flatbuf->size() / sizeof(uoffset_t), false) { @@ -287,10 +287,7 @@ class ResizeContext { // Now change all the offsets by delta_. auto root = GetAnyRoot(buf_.data()); Straddle(buf_.data(), root, buf_.data()); - ResizeTable(root_table_name - ? *schema.objects()->LookupByKey(root_table_name) - : *schema.root_table(), - root); + ResizeTable(root_table ? *root_table : *schema.root_table(), root); // We can now add or remove bytes at start. if (delta_ > 0) buf_.insert(buf_.begin() + start, delta_, 0); else buf_.erase(buf_.begin() + start, buf_.begin() + start - delta_); @@ -401,16 +398,18 @@ class ResizeContext { // Changes the contents of a string inside a FlatBuffer. FlatBuffer must // live inside a std::vector so we can resize the buffer if needed. // "str" must live inside "flatbuf" and may be invalidated after this call. +// If your FlatBuffer's root table is not the schema's root table, you should +// pass in your root_table type as well. inline void SetString(const reflection::Schema &schema, const std::string &val, const String *str, std::vector *flatbuf, - const char* root_table_name) { + const reflection::Object* root_table = nullptr) { auto delta = static_cast(val.size()) - static_cast(str->Length()); auto start = static_cast(reinterpret_cast(str) - flatbuf->data() + sizeof(uoffset_t)); if (delta) { // Different size, we must expand (or contract). - ResizeContext(schema, start, delta, flatbuf, root_table_name); + ResizeContext(schema, start, delta, flatbuf, root_table); if (delta < 0) { // Clear the old string, since we don't want parts of it remaining. memset(flatbuf->data() + start, 0, str->Length()); @@ -424,19 +423,18 @@ inline void SetString(const reflection::Schema &schema, const std::string &val, // live inside a std::vector so we can resize the buffer if needed. // "vec" must live inside "flatbuf" and may be invalidated after this call. // If your FlatBuffer's root table is not the schema's root table, you should -// pass in the name of the root table in "root_table_name". -template void ResizeVector(const reflection::Schema &schema, - uoffset_t newsize, T val, - const Vector *vec, - std::vector *flatbuf, - const char* root_table_name = nullptr) { +// pass in your root_table type as well. +template +void ResizeVector(const reflection::Schema &schema, uoffset_t newsize, T val, + const Vector *vec, std::vector *flatbuf, + const reflection::Object *root_table = nullptr) { auto delta_elem = static_cast(newsize) - static_cast(vec->size()); auto delta_bytes = delta_elem * static_cast(sizeof(T)); auto vec_start = reinterpret_cast(vec) - flatbuf->data(); auto start = static_cast(vec_start + sizeof(uoffset_t) + sizeof(T) * vec->size()); if (delta_bytes) { - ResizeContext(schema, start, delta_bytes, flatbuf, root_table_name); + ResizeContext(schema, start, delta_bytes, flatbuf, root_table); WriteScalar(flatbuf->data() + vec_start, newsize); // Length field. // Set new elements to "val". for (int i = 0; i < delta_elem; i++) { -- 2.7.4