From cc8424009853447b209c5d3ccb12c23a2f134fa4 Mon Sep 17 00:00:00 2001
From: Wouter van Oortmerssen <aardappel@gmail.com>
Date: Wed, 4 Jan 2017 10:12:39 -0800
Subject: [PATCH] Misc idl_gen_cpp cleanup

- Update to be const-correct where possible.
- Consistently pass |code| as pointer instead of non-const-ref.
- No newlines (\n) characters in the middle of code strings.
- Use if-else if-else statements instead of nested ternary operators.
- Ensure all lines end at 80 chars.
- Make utility functions static.

From cl/143505731.

Change-Id: If0fab9ee75de5af963367a948dddf53af93f73b4
---
 include/flatbuffers/code_generators.h         |  30 +-
 include/flatbuffers/reflection_generated.h    | 140 +++-
 samples/monster_generated.h                   |  46 +-
 src/idl_gen_cpp.cpp                           | 662 ++++++++++--------
 src/idl_gen_general.cpp                       |   2 +-
 tests/monster_test_generated.h                | 134 +++-
 .../namespace_test1_generated.h               |   4 +-
 .../namespace_test2_generated.h               |  24 +-
 8 files changed, 645 insertions(+), 397 deletions(-)

diff --git a/include/flatbuffers/code_generators.h b/include/flatbuffers/code_generators.h
index 8b097ef7..5bd2219f 100644
--- a/include/flatbuffers/code_generators.h
+++ b/include/flatbuffers/code_generators.h
@@ -23,9 +23,9 @@ class BaseGenerator {
  public:
   virtual bool generate() = 0;
 
-  static const std::string NamespaceDir(const Parser &parser,
-                                        const std::string &path,
-                                        const Namespace &ns) {
+  static std::string NamespaceDir(const Parser &parser,
+                                  const std::string &path,
+                                  const Namespace &ns) {
     EnsureDirExists(path.c_str());
     if (parser.opts.one_file) return path;
     std::string namespace_dir = path;  // Either empty or ends in separator.
@@ -46,14 +46,14 @@ class BaseGenerator {
         path_(path),
         file_name_(file_name),
         qualifying_start_(qualifying_start),
-        qualifying_separator_(qualifying_separator){};
-  virtual ~BaseGenerator(){};
+        qualifying_separator_(qualifying_separator) {}
+  virtual ~BaseGenerator() {}
 
   // No copy/assign.
   BaseGenerator &operator=(const BaseGenerator &);
   BaseGenerator(const BaseGenerator &);
 
-  const std::string NamespaceDir(const Namespace &ns) {
+  std::string NamespaceDir(const Namespace &ns) const {
     return BaseGenerator::NamespaceDir(parser_, path_, ns);
   }
 
@@ -62,7 +62,7 @@ class BaseGenerator {
            " do not modify\n\n";
   }
 
-  bool IsEverythingGenerated() {
+  bool IsEverythingGenerated() const {
     for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
          ++it) {
       if (!(*it)->generated) return false;
@@ -74,7 +74,7 @@ class BaseGenerator {
     return true;
   }
 
-  std::string FullNamespace(const char *separator, const Namespace &ns) {
+  static std::string FullNamespace(const char *separator, const Namespace &ns) {
     std::string namespace_name;
     auto &namespaces = ns.components;
     for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {
@@ -84,10 +84,9 @@ class BaseGenerator {
     return namespace_name;
   }
 
-  const std::string LastNamespacePart(const Namespace &ns) {
-    auto &namespaces = ns.components;
-    if (namespaces.size())
-      return *(namespaces.end() - 1);
+  static std::string LastNamespacePart(const Namespace &ns) {
+    if (!ns.components.empty())
+      return ns.components.back();
     else
       return std::string("");
   }
@@ -96,11 +95,12 @@ class BaseGenerator {
   // c++, java and csharp returns a different namespace from
   // the following default (no early exit, always fully qualify),
   // which works for js and php
-  virtual const Namespace *CurrentNameSpace() { return nullptr; }
+  virtual const Namespace *CurrentNameSpace() const { return nullptr; }
 
   // Ensure that a type is prefixed with its namespace whenever it is used
   // outside of its namespace.
-  std::string WrapInNameSpace(const Namespace *ns, const std::string &name) {
+  std::string WrapInNameSpace(const Namespace *ns,
+                              const std::string &name) const {
     if (CurrentNameSpace() == ns) return name;
     std::string qualified_name = qualifying_start_;
     for (auto it = ns->components.begin(); it != ns->components.end(); ++it)
@@ -108,7 +108,7 @@ class BaseGenerator {
     return qualified_name + name;
   }
 
-  std::string WrapInNameSpace(const Definition &def) {
+  std::string WrapInNameSpace(const Definition &def) const {
     return WrapInNameSpace(def.defined_namespace, def.name);
   }
 
diff --git a/include/flatbuffers/reflection_generated.h b/include/flatbuffers/reflection_generated.h
index b6233ff0..5a810b70 100644
--- a/include/flatbuffers/reflection_generated.h
+++ b/include/flatbuffers/reflection_generated.h
@@ -69,9 +69,15 @@ struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct TypeBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_base_type(BaseType base_type) { fbb_.AddElement<int8_t>(Type::VT_BASE_TYPE, static_cast<int8_t>(base_type), 0); }
-  void add_element(BaseType element) { fbb_.AddElement<int8_t>(Type::VT_ELEMENT, static_cast<int8_t>(element), 0); }
-  void add_index(int32_t index) { fbb_.AddElement<int32_t>(Type::VT_INDEX, index, -1); }
+  void add_base_type(BaseType base_type) {
+    fbb_.AddElement<int8_t>(Type::VT_BASE_TYPE, static_cast<int8_t>(base_type), 0);
+  }
+  void add_element(BaseType element) {
+    fbb_.AddElement<int8_t>(Type::VT_ELEMENT, static_cast<int8_t>(element), 0);
+  }
+  void add_index(int32_t index) {
+    fbb_.AddElement<int32_t>(Type::VT_INDEX, index, -1);
+  }
   TypeBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   TypeBuilder &operator=(const TypeBuilder &);
   flatbuffers::Offset<Type> Finish() {
@@ -113,8 +119,12 @@ struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct KeyValueBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_key(flatbuffers::Offset<flatbuffers::String> key) { fbb_.AddOffset(KeyValue::VT_KEY, key); }
-  void add_value(flatbuffers::Offset<flatbuffers::String> value) { fbb_.AddOffset(KeyValue::VT_VALUE, value); }
+  void add_key(flatbuffers::Offset<flatbuffers::String> key) {
+    fbb_.AddOffset(KeyValue::VT_KEY, key);
+  }
+  void add_value(flatbuffers::Offset<flatbuffers::String> value) {
+    fbb_.AddOffset(KeyValue::VT_VALUE, value);
+  }
   KeyValueBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   KeyValueBuilder &operator=(const KeyValueBuilder &);
   flatbuffers::Offset<KeyValue> Finish() {
@@ -164,9 +174,15 @@ struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct EnumValBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(EnumVal::VT_NAME, name); }
-  void add_value(int64_t value) { fbb_.AddElement<int64_t>(EnumVal::VT_VALUE, value, 0); }
-  void add_object(flatbuffers::Offset<Object> object) { fbb_.AddOffset(EnumVal::VT_OBJECT, object); }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(EnumVal::VT_NAME, name);
+  }
+  void add_value(int64_t value) {
+    fbb_.AddElement<int64_t>(EnumVal::VT_VALUE, value, 0);
+  }
+  void add_object(flatbuffers::Offset<Object> object) {
+    fbb_.AddOffset(EnumVal::VT_OBJECT, object);
+  }
   EnumValBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   EnumValBuilder &operator=(const EnumValBuilder &);
   flatbuffers::Offset<EnumVal> Finish() {
@@ -229,11 +245,21 @@ struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct EnumBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(Enum::VT_NAME, name); }
-  void add_values(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<EnumVal>>> values) { fbb_.AddOffset(Enum::VT_VALUES, values); }
-  void add_is_union(bool is_union) { fbb_.AddElement<uint8_t>(Enum::VT_IS_UNION, static_cast<uint8_t>(is_union), 0); }
-  void add_underlying_type(flatbuffers::Offset<Type> underlying_type) { fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type); }
-  void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<KeyValue>>> attributes) { fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes); }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(Enum::VT_NAME, name);
+  }
+  void add_values(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<EnumVal>>> values) {
+    fbb_.AddOffset(Enum::VT_VALUES, values);
+  }
+  void add_is_union(bool is_union) {
+    fbb_.AddElement<uint8_t>(Enum::VT_IS_UNION, static_cast<uint8_t>(is_union), 0);
+  }
+  void add_underlying_type(flatbuffers::Offset<Type> underlying_type) {
+    fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type);
+  }
+  void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<KeyValue>>> attributes) {
+    fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes);
+  }
   EnumBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   EnumBuilder &operator=(const EnumBuilder &);
   flatbuffers::Offset<Enum> Finish() {
@@ -317,16 +343,36 @@ struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct FieldBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(Field::VT_NAME, name); }
-  void add_type(flatbuffers::Offset<Type> type) { fbb_.AddOffset(Field::VT_TYPE, type); }
-  void add_id(uint16_t id) { fbb_.AddElement<uint16_t>(Field::VT_ID, id, 0); }
-  void add_offset(uint16_t offset) { fbb_.AddElement<uint16_t>(Field::VT_OFFSET, offset, 0); }
-  void add_default_integer(int64_t default_integer) { fbb_.AddElement<int64_t>(Field::VT_DEFAULT_INTEGER, default_integer, 0); }
-  void add_default_real(double default_real) { fbb_.AddElement<double>(Field::VT_DEFAULT_REAL, default_real, 0.0); }
-  void add_deprecated(bool deprecated) { fbb_.AddElement<uint8_t>(Field::VT_DEPRECATED, static_cast<uint8_t>(deprecated), 0); }
-  void add_required(bool required) { fbb_.AddElement<uint8_t>(Field::VT_REQUIRED, static_cast<uint8_t>(required), 0); }
-  void add_key(bool key) { fbb_.AddElement<uint8_t>(Field::VT_KEY, static_cast<uint8_t>(key), 0); }
-  void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<KeyValue>>> attributes) { fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes); }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(Field::VT_NAME, name);
+  }
+  void add_type(flatbuffers::Offset<Type> type) {
+    fbb_.AddOffset(Field::VT_TYPE, type);
+  }
+  void add_id(uint16_t id) {
+    fbb_.AddElement<uint16_t>(Field::VT_ID, id, 0);
+  }
+  void add_offset(uint16_t offset) {
+    fbb_.AddElement<uint16_t>(Field::VT_OFFSET, offset, 0);
+  }
+  void add_default_integer(int64_t default_integer) {
+    fbb_.AddElement<int64_t>(Field::VT_DEFAULT_INTEGER, default_integer, 0);
+  }
+  void add_default_real(double default_real) {
+    fbb_.AddElement<double>(Field::VT_DEFAULT_REAL, default_real, 0.0);
+  }
+  void add_deprecated(bool deprecated) {
+    fbb_.AddElement<uint8_t>(Field::VT_DEPRECATED, static_cast<uint8_t>(deprecated), 0);
+  }
+  void add_required(bool required) {
+    fbb_.AddElement<uint8_t>(Field::VT_REQUIRED, static_cast<uint8_t>(required), 0);
+  }
+  void add_key(bool key) {
+    fbb_.AddElement<uint8_t>(Field::VT_KEY, static_cast<uint8_t>(key), 0);
+  }
+  void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<KeyValue>>> attributes) {
+    fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes);
+  }
   FieldBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   FieldBuilder &operator=(const FieldBuilder &);
   flatbuffers::Offset<Field> Finish() {
@@ -413,12 +459,24 @@ struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct ObjectBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(Object::VT_NAME, name); }
-  void add_fields(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Field>>> fields) { fbb_.AddOffset(Object::VT_FIELDS, fields); }
-  void add_is_struct(bool is_struct) { fbb_.AddElement<uint8_t>(Object::VT_IS_STRUCT, static_cast<uint8_t>(is_struct), 0); }
-  void add_minalign(int32_t minalign) { fbb_.AddElement<int32_t>(Object::VT_MINALIGN, minalign, 0); }
-  void add_bytesize(int32_t bytesize) { fbb_.AddElement<int32_t>(Object::VT_BYTESIZE, bytesize, 0); }
-  void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<KeyValue>>> attributes) { fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes); }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(Object::VT_NAME, name);
+  }
+  void add_fields(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Field>>> fields) {
+    fbb_.AddOffset(Object::VT_FIELDS, fields);
+  }
+  void add_is_struct(bool is_struct) {
+    fbb_.AddElement<uint8_t>(Object::VT_IS_STRUCT, static_cast<uint8_t>(is_struct), 0);
+  }
+  void add_minalign(int32_t minalign) {
+    fbb_.AddElement<int32_t>(Object::VT_MINALIGN, minalign, 0);
+  }
+  void add_bytesize(int32_t bytesize) {
+    fbb_.AddElement<int32_t>(Object::VT_BYTESIZE, bytesize, 0);
+  }
+  void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<KeyValue>>> attributes) {
+    fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes);
+  }
   ObjectBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   ObjectBuilder &operator=(const ObjectBuilder &);
   flatbuffers::Offset<Object> Finish() {
@@ -490,11 +548,21 @@ struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct SchemaBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_objects(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Object>>> objects) { fbb_.AddOffset(Schema::VT_OBJECTS, objects); }
-  void add_enums(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Enum>>> enums) { fbb_.AddOffset(Schema::VT_ENUMS, enums); }
-  void add_file_ident(flatbuffers::Offset<flatbuffers::String> file_ident) { fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident); }
-  void add_file_ext(flatbuffers::Offset<flatbuffers::String> file_ext) { fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext); }
-  void add_root_table(flatbuffers::Offset<Object> root_table) { fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table); }
+  void add_objects(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Object>>> objects) {
+    fbb_.AddOffset(Schema::VT_OBJECTS, objects);
+  }
+  void add_enums(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Enum>>> enums) {
+    fbb_.AddOffset(Schema::VT_ENUMS, enums);
+  }
+  void add_file_ident(flatbuffers::Offset<flatbuffers::String> file_ident) {
+    fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident);
+  }
+  void add_file_ext(flatbuffers::Offset<flatbuffers::String> file_ext) {
+    fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext);
+  }
+  void add_root_table(flatbuffers::Offset<Object> root_table) {
+    fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table);
+  }
   SchemaBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   SchemaBuilder &operator=(const SchemaBuilder &);
   flatbuffers::Offset<Schema> Finish() {
@@ -545,7 +613,9 @@ inline bool VerifySchemaBuffer(flatbuffers::Verifier &verifier) {
   return verifier.VerifyBuffer<reflection::Schema>(SchemaIdentifier());
 }
 
-inline const char *SchemaExtension() { return "bfbs"; }
+inline const char *SchemaExtension() {
+  return "bfbs";
+}
 
 inline void FinishSchemaBuffer(flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset<reflection::Schema> root) {
   fbb.Finish(root, SchemaIdentifier());
diff --git a/samples/monster_generated.h b/samples/monster_generated.h
index 6c7b3059..cbd8ee68 100644
--- a/samples/monster_generated.h
+++ b/samples/monster_generated.h
@@ -56,7 +56,7 @@ template<> struct EquipmentTraits<Weapon> {
 struct EquipmentUnion {
   Equipment type;
 
-  flatbuffers::NativeTable *table;
+  flatbuffers::NativeTable *table = nullptr;
   EquipmentUnion() : type(Equipment_NONE), table(nullptr) {}
   EquipmentUnion(const EquipmentUnion &);
   EquipmentUnion &operator=(const EquipmentUnion &);
@@ -173,15 +173,33 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct MonsterBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_pos(const Vec3 *pos) { fbb_.AddStruct(Monster::VT_POS, pos); }
-  void add_mana(int16_t mana) { fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150); }
-  void add_hp(int16_t hp) { fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100); }
-  void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(Monster::VT_NAME, name); }
-  void add_inventory(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory) { fbb_.AddOffset(Monster::VT_INVENTORY, inventory); }
-  void add_color(Color color) { fbb_.AddElement<int8_t>(Monster::VT_COLOR, static_cast<int8_t>(color), 2); }
-  void add_weapons(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Weapon>>> weapons) { fbb_.AddOffset(Monster::VT_WEAPONS, weapons); }
-  void add_equipped_type(Equipment equipped_type) { fbb_.AddElement<uint8_t>(Monster::VT_EQUIPPED_TYPE, static_cast<uint8_t>(equipped_type), 0); }
-  void add_equipped(flatbuffers::Offset<void> equipped) { fbb_.AddOffset(Monster::VT_EQUIPPED, equipped); }
+  void add_pos(const Vec3 *pos) {
+    fbb_.AddStruct(Monster::VT_POS, pos);
+  }
+  void add_mana(int16_t mana) {
+    fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);
+  }
+  void add_hp(int16_t hp) {
+    fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);
+  }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(Monster::VT_NAME, name);
+  }
+  void add_inventory(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory) {
+    fbb_.AddOffset(Monster::VT_INVENTORY, inventory);
+  }
+  void add_color(Color color) {
+    fbb_.AddElement<int8_t>(Monster::VT_COLOR, static_cast<int8_t>(color), 2);
+  }
+  void add_weapons(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Weapon>>> weapons) {
+    fbb_.AddOffset(Monster::VT_WEAPONS, weapons);
+  }
+  void add_equipped_type(Equipment equipped_type) {
+    fbb_.AddElement<uint8_t>(Monster::VT_EQUIPPED_TYPE, static_cast<uint8_t>(equipped_type), 0);
+  }
+  void add_equipped(flatbuffers::Offset<void> equipped) {
+    fbb_.AddOffset(Monster::VT_EQUIPPED, equipped);
+  }
   MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   MonsterBuilder &operator=(const MonsterBuilder &);
   flatbuffers::Offset<Monster> Finish() {
@@ -260,8 +278,12 @@ struct Weapon FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct WeaponBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(Weapon::VT_NAME, name); }
-  void add_damage(int16_t damage) { fbb_.AddElement<int16_t>(Weapon::VT_DAMAGE, damage, 0); }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(Weapon::VT_NAME, name);
+  }
+  void add_damage(int16_t damage) {
+    fbb_.AddElement<int16_t>(Weapon::VT_DAMAGE, damage, 0);
+  }
   WeaponBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   WeaponBuilder &operator=(const WeaponBuilder &);
   flatbuffers::Offset<Weapon> Finish() {
diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp
index 5154b85d..65f13550 100644
--- a/src/idl_gen_cpp.cpp
+++ b/src/idl_gen_cpp.cpp
@@ -23,10 +23,6 @@
 
 namespace flatbuffers {
 
-struct IsAlnum {
-  bool operator()(char c) { return !isalnum(c); }
-};
-
 static std::string GeneratedFileName(const std::string &path,
                                      const std::string &file_name) {
   return path + file_name + "_generated.h";
@@ -38,51 +34,62 @@ class CppGenerator : public BaseGenerator {
   CppGenerator(const Parser &parser, const std::string &path,
                const std::string &file_name)
       : BaseGenerator(parser, path, file_name, "", "::"),
-        cur_name_space_(nullptr){};
-  // Iterate through all definitions we haven't generate code for (enums,
-  // structs,
-  // and tables) and output them to a single file.
-  bool generate() {
-    if (IsEverythingGenerated()) return true;
-
-    std::string code;
-    code = code + "// " + FlatBuffersGeneratedWarning();
+        cur_name_space_(nullptr) {}
 
+  std::string GenIncludeGuard() const {
     // Generate include guard.
-    std::string include_guard_ident = file_name_;
+    std::string guard = file_name_;
     // Remove any non-alpha-numeric characters that may appear in a filename.
-    include_guard_ident.erase(
-        std::remove_if(include_guard_ident.begin(), include_guard_ident.end(),
-                       IsAlnum()),
-        include_guard_ident.end());
-    std::string include_guard = "FLATBUFFERS_GENERATED_" + include_guard_ident;
-    include_guard += "_";
+    struct IsAlnum {
+      bool operator()(char c) { return !isalnum(c); }
+    };
+    guard.erase(std::remove_if(guard.begin(), guard.end(), IsAlnum()),
+                guard.end());
+    guard = "FLATBUFFERS_GENERATED_" + guard;
+    guard += "_";
     // For further uniqueness, also add the namespace.
     auto name_space = parser_.namespaces_.back();
     for (auto it = name_space->components.begin();
          it != name_space->components.end(); ++it) {
-      include_guard += *it + "_";
+      guard += *it + "_";
     }
-    include_guard += "H_";
-    std::transform(include_guard.begin(), include_guard.end(),
-                   include_guard.begin(), ::toupper);
+    guard += "H_";
+    std::transform(guard.begin(), guard.end(), guard.begin(), ::toupper);
+    return guard;
+  }
+
+  void GenIncludeDependencies(std::string* code_ptr) const {
+    std::string& code = *code_ptr;
+
+    int num_includes = 0;
+    for (auto it = parser_.included_files_.begin();
+         it != parser_.included_files_.end(); ++it) {
+      const std::string basename =
+          flatbuffers::StripPath(flatbuffers::StripExtension(it->first));
+      if (basename != file_name_) {
+        code += "#include \"" + basename + "_generated.h\"\n";
+        num_includes++;
+      }
+    }
+    if (num_includes) code += "\n";
+  }
+
+  // Iterate through all definitions we haven't generate code for (enums,
+  // structs, and tables) and output them to a single file.
+  bool generate() {
+    if (IsEverythingGenerated()) return true;
+
+    std::string code;
+    code = code + "// " + FlatBuffersGeneratedWarning();
+
+    const std::string include_guard = GenIncludeGuard();
     code += "#ifndef " + include_guard + "\n";
     code += "#define " + include_guard + "\n\n";
 
     code += "#include \"flatbuffers/flatbuffers.h\"\n\n";
 
     if (parser_.opts.include_dependence_headers) {
-      int num_includes = 0;
-      for (auto it = parser_.included_files_.begin();
-           it != parser_.included_files_.end(); ++it) {
-        auto basename =
-            flatbuffers::StripPath(flatbuffers::StripExtension(it->first));
-        if (basename != file_name_) {
-          code += "#include \"" + basename + "_generated.h\"\n";
-          num_includes++;
-        }
-      }
-      if (num_includes) code += "\n";
+      GenIncludeDependencies(&code);
     }
 
     assert(!cur_name_space_);
@@ -91,7 +98,7 @@ class CppGenerator : public BaseGenerator {
     // have circular references.
     for (auto it = parser_.structs_.vec.begin();
          it != parser_.structs_.vec.end(); ++it) {
-      auto &struct_def = **it;
+      const auto &struct_def = **it;
       if (!struct_def.generated) {
         SetNameSpace(struct_def.defined_namespace, &code);
         code += "struct " + struct_def.name + ";\n";
@@ -105,17 +112,17 @@ class CppGenerator : public BaseGenerator {
     // Generate code for all the enum declarations.
     for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
          ++it) {
-      auto &enum_def = **it;
+      const auto &enum_def = **it;
       if (!enum_def.generated) {
-        SetNameSpace((**it).defined_namespace, &code);
-        GenEnum(**it, &code);
+        SetNameSpace(enum_def.defined_namespace, &code);
+        GenEnum(enum_def, &code);
       }
     }
 
     // Generate code for all structs, then all tables.
     for (auto it = parser_.structs_.vec.begin();
          it != parser_.structs_.vec.end(); ++it) {
-      auto &struct_def = **it;
+      const auto &struct_def = **it;
       if (struct_def.fixed && !struct_def.generated) {
         SetNameSpace(struct_def.defined_namespace, &code);
         GenStruct(struct_def, &code);
@@ -123,7 +130,7 @@ class CppGenerator : public BaseGenerator {
     }
     for (auto it = parser_.structs_.vec.begin();
          it != parser_.structs_.vec.end(); ++it) {
-      auto &struct_def = **it;
+      const auto &struct_def = **it;
       if (!struct_def.fixed && !struct_def.generated) {
         SetNameSpace(struct_def.defined_namespace, &code);
         GenTable(struct_def, &code);
@@ -131,7 +138,7 @@ class CppGenerator : public BaseGenerator {
     }
     for (auto it = parser_.structs_.vec.begin();
          it != parser_.structs_.vec.end(); ++it) {
-      auto &struct_def = **it;
+      const auto &struct_def = **it;
       if (!struct_def.fixed && !struct_def.generated) {
         SetNameSpace(struct_def.defined_namespace, &code);
         GenTablePost(struct_def, &code);
@@ -141,7 +148,7 @@ class CppGenerator : public BaseGenerator {
     // Generate code for union verifiers.
     for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
          ++it) {
-      auto &enum_def = **it;
+      const auto &enum_def = **it;
       if (enum_def.is_union && !enum_def.generated) {
         SetNameSpace(enum_def.defined_namespace, &code);
         GenUnionPost(enum_def, &code);
@@ -151,64 +158,64 @@ class CppGenerator : public BaseGenerator {
     // Generate convenient global helper functions:
     if (parser_.root_struct_def_) {
       SetNameSpace((*parser_.root_struct_def_).defined_namespace, &code);
-      auto &name = parser_.root_struct_def_->name;
-      std::string qualified_name =
+      const std::string &name = parser_.root_struct_def_->name;
+      const std::string qualified_name =
           parser_.namespaces_.back()->GetFullyQualifiedName(name);
-      std::string cpp_qualified_name = TranslateNameSpace(qualified_name);
+      const std::string cpp_name = TranslateNameSpace(qualified_name);
 
       // The root datatype accessor:
-      code += "inline const " + cpp_qualified_name + " *Get";
-      code += name;
-      code += "(const void *buf) {\n  return flatbuffers::GetRoot<";
-      code += cpp_qualified_name + ">(buf);\n}\n\n";
+      code += "inline ";
+      code += "const " + cpp_name + " *Get" + name + "(const void *buf) {\n";
+      code += "  return flatbuffers::GetRoot<" + cpp_name + ">(buf);\n";
+      code += "}\n\n";
+
       if (parser_.opts.mutable_buffer) {
-        code += "inline " + name + " *GetMutable";
-        code += name;
-        code += "(void *buf) {\n  return flatbuffers::GetMutableRoot<";
-        code += name + ">(buf);\n}\n\n";
+        code += "inline " + name + " *GetMutable" + name + "(void *buf) {\n";
+        code += "  return flatbuffers::GetMutableRoot<" + name + ">(buf);\n";
+        code += "}\n\n";
       }
 
       if (parser_.file_identifier_.length()) {
         // Return the identifier
-        code += "inline const char *" + name;
-        code += "Identifier() {\n  return \"" + parser_.file_identifier_;
-        code += "\";\n}\n\n";
+        code += "inline const char *" + name + "Identifier() {\n";
+        code += "  return \"" + parser_.file_identifier_ + "\";\n";
+        code += "}\n\n";
 
         // Check if a buffer has the identifier.
-        code += "inline bool " + name;
-        code += "BufferHasIdentifier(const void *buf) {\n  return flatbuffers::";
-        code += "BufferHasIdentifier(buf, ";
-        code += name + "Identifier());\n}\n\n";
+        code += "inline ";
+        code += "bool " + name + "BufferHasIdentifier(const void *buf) {\n";
+        code += "  return flatbuffers::BufferHasIdentifier(buf, ";
+        code += name + "Identifier());\n";
+        code += "}\n\n";
       }
 
-      // The root verifier:
-      code += "inline bool Verify";
-      code += name;
-      code +=
-          "Buffer(flatbuffers::Verifier &verifier) {\n"
-          "  return verifier.VerifyBuffer<";
-      code += cpp_qualified_name + ">(";
+      // The root verifier.
+      code += "inline bool Verify" + name + "Buffer(";
+      code += "flatbuffers::Verifier &verifier) {\n";
+      code += "  return verifier.VerifyBuffer<" + cpp_name + ">(";
       if (parser_.file_identifier_.length())
         code += name + "Identifier()";
       else
         code += "nullptr";
-      code += ");\n}\n\n";
+      code += ");\n";
+      code += "}\n\n";
 
       if (parser_.file_extension_.length()) {
         // Return the extension
-        code += "inline const char *" + name;
-        code += "Extension() { return \"" + parser_.file_extension_;
-        code += "\"; }\n\n";
+        code += "inline const char *" + name + "Extension() {\n";
+        code += "  return \"" + parser_.file_extension_ + "\";\n";
+        code += "}\n\n";
       }
 
       // Finish a buffer with a given root object:
-      code += "inline void Finish" + name;
-      code +=
-          "Buffer(flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset<";
-      code += cpp_qualified_name + "> root) {\n  fbb.Finish(root";
+      code += "inline void Finish" + name + "Buffer";
+      code += "(flatbuffers::FlatBufferBuilder &fbb, ";
+      code += "flatbuffers::Offset<" + cpp_name + "> root) {\n";
       if (parser_.file_identifier_.length())
-        code += ", " + name + "Identifier()";
-      code += ");\n}\n\n";
+        code += "  fbb.Finish(root, " + name + "Identifier());\n";
+      else
+        code += "  fbb.Finish(root);\n";
+      code += "}\n\n";
 
       if (parser_.opts.generate_object_based_api) {
         // A convenient root unpack function.
@@ -217,9 +224,11 @@ class CppGenerator : public BaseGenerator {
         code += "inline " + GenTypeNativePtr(native_name, nullptr, false);
         code += " UnPack" + name;
         code += "(const void *buf, const flatbuffers::resolver_function_t *";
-        code += "resolver = nullptr) {\n  return ";
+        code += "resolver = nullptr) {\n";
+        code += "  return ";
         code += GenTypeNativePtr(native_name, nullptr, true);
-        code += "(Get" + name + "(buf)->UnPack(resolver));\n}\n\n";
+        code += "(Get" + name + "(buf)->UnPack(resolver));\n";
+        code += "}\n\n";
       }
     }
 
@@ -236,7 +245,7 @@ class CppGenerator : public BaseGenerator {
   // This tracks the current namespace so we can insert namespace declarations.
   const Namespace *cur_name_space_;
 
-  const Namespace *CurrentNameSpace() { return cur_name_space_; }
+  const Namespace *CurrentNameSpace() const { return cur_name_space_; }
 
   // Translates a qualified name in flatbuffer text format to the same name in
   // the equivalent C++ namespace.
@@ -251,7 +260,7 @@ class CppGenerator : public BaseGenerator {
   }
 
   // Return a C++ type from the table in idl.h
-  std::string GenTypeBasic(const Type &type, bool user_facing_type) {
+  std::string GenTypeBasic(const Type &type, bool user_facing_type) const {
     static const char *ctypename[] = {
     #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \
             #CTYPE,
@@ -267,43 +276,53 @@ class CppGenerator : public BaseGenerator {
 
   // Return a C++ pointer type, specialized to the actual struct/table types,
   // and vector element types.
-  std::string GenTypePointer(const Type &type) {
+  std::string GenTypePointer(const Type &type) const {
     switch (type.base_type) {
-      case BASE_TYPE_STRING:
+      case BASE_TYPE_STRING: {
         return "flatbuffers::String";
-      case BASE_TYPE_VECTOR:
-        return "flatbuffers::Vector<" +
-               GenTypeWire(type.VectorType(), "", false) + ">";
-      case BASE_TYPE_STRUCT:
+      }
+      case BASE_TYPE_VECTOR: {
+        const auto type_name = GenTypeWire(type.VectorType(), "", false);
+        return "flatbuffers::Vector<" + type_name + ">";
+      }
+      case BASE_TYPE_STRUCT: {
         return WrapInNameSpace(*type.struct_def);
+      }
       case BASE_TYPE_UNION:
       // fall through
-      default:
+      default: {
         return "void";
+      }
     }
   }
 
   // Return a C++ type for any type (scalar/pointer) specifically for
   // building a flatbuffer.
   std::string GenTypeWire(const Type &type, const char *postfix,
-                          bool user_facing_type) {
-    return IsScalar(type.base_type)
-               ? GenTypeBasic(type, user_facing_type) + postfix
-               : IsStruct(type) ? "const " + GenTypePointer(type) + " *"
-                                : "flatbuffers::Offset<" +
-                                      GenTypePointer(type) + ">" + postfix;
+                          bool user_facing_type) const {
+    if (IsScalar(type.base_type)) {
+      return GenTypeBasic(type, user_facing_type) + postfix;
+    } else if (IsStruct(type)) {
+      return "const " + GenTypePointer(type) + " *";
+    } else {
+      return "flatbuffers::Offset<" + GenTypePointer(type) + ">" + postfix;
+    }
   }
 
   // Return a C++ type for any type (scalar/pointer) that reflects its
   // serialized size.
-  std::string GenTypeSize(const Type &type) {
-    return IsScalar(type.base_type) ? GenTypeBasic(type, false)
-                                    : IsStruct(type) ? GenTypePointer(type)
-                                                     : "flatbuffers::uoffset_t";
+  std::string GenTypeSize(const Type &type) const {
+    if (IsScalar(type.base_type)) {
+      return GenTypeBasic(type, false);
+    } else if (IsStruct(type)) {
+      return GenTypePointer(type);
+    } else {
+      return "flatbuffers::uoffset_t";
+    }
   }
 
   // TODO(wvo): make this configurable.
-  std::string NativeName(const std::string &name) { return name + "T"; }
+  static std::string NativeName(const std::string &name) { return name + "T"; }
 
   const std::string &PtrType(const FieldDef *field) {
     auto attr = field ? field->attributes.Lookup("cpp_ptr_type") : nullptr;
@@ -313,8 +332,13 @@ class CppGenerator : public BaseGenerator {
   std::string GenTypeNativePtr(const std::string &type, const FieldDef *field,
                                bool is_constructor) {
     auto &ptr_type = PtrType(field);
-    if (ptr_type == "naked") return is_constructor ? "" : type + " *";
-    return ptr_type + "<" + type + ">";
+    if (ptr_type != "naked") {
+      return ptr_type + "<" + type + ">";
+    } else if (is_constructor) {
+      return "";
+    } else {
+      return type + " *";
+    }
   }
 
   std::string GenPtrGet(const FieldDef &field) {
@@ -325,27 +349,31 @@ class CppGenerator : public BaseGenerator {
   std::string GenTypeNative(const Type &type, bool invector,
                             const FieldDef &field) {
     switch (type.base_type) {
-      case BASE_TYPE_STRING:
+      case BASE_TYPE_STRING: {
         return "std::string";
-      case BASE_TYPE_VECTOR:
-        return "std::vector<" + GenTypeNative(type.VectorType(), true, field) +
-               ">";
-      case BASE_TYPE_STRUCT:
+      }
+      case BASE_TYPE_VECTOR: {
+        const auto type_name = GenTypeNative(type.VectorType(), true, field);
+        return "std::vector<" + type_name + ">";
+      }
+      case BASE_TYPE_STRUCT: {
+        const auto type_name = WrapInNameSpace(*type.struct_def);
         if (IsStruct(type)) {
           if (invector || field.native_inline) {
-            return WrapInNameSpace(*type.struct_def);
+            return type_name;
           } else {
-            return GenTypeNativePtr(WrapInNameSpace(*type.struct_def), &field,
-                                    false);
+            return GenTypeNativePtr(type_name, &field, false);
           }
         } else {
-          return GenTypeNativePtr(NativeName(WrapInNameSpace(*type.struct_def)),
-                                  &field, false);
+          return GenTypeNativePtr(NativeName(type_name), &field, false);
         }
-      case BASE_TYPE_UNION:
+      }
+      case BASE_TYPE_UNION: {
         return type.enum_def->name + "Union";
-      default:
+      }
+      default: {
         return GenTypeBasic(type, true);
+      }
     }
   }
 
@@ -354,25 +382,27 @@ class CppGenerator : public BaseGenerator {
   std::string GenTypeGet(const Type &type, const char *afterbasic,
                          const char *beforeptr, const char *afterptr,
                          bool user_facing_type) {
-    return IsScalar(type.base_type)
-               ? GenTypeBasic(type, user_facing_type) + afterbasic
-               : beforeptr + GenTypePointer(type) + afterptr;
+    if (IsScalar(type.base_type)) {
+      return GenTypeBasic(type, user_facing_type) + afterbasic;
+    } else {
+      return beforeptr + GenTypePointer(type) + afterptr;
+    }
   }
 
-  static std::string GenEnumDecl(const EnumDef &enum_def,
-                                 const IDLOptions &opts) {
+  std::string GenEnumDecl(const EnumDef &enum_def) const {
+    const IDLOptions &opts = parser_.opts;
     return (opts.scoped_enums ? "enum class " : "enum ") + enum_def.name;
   }
 
-  static std::string GenEnumValDecl(const EnumDef &enum_def,
-                                    const std::string &enum_val,
-                                    const IDLOptions &opts) {
+  std::string GenEnumValDecl(const EnumDef &enum_def,
+                             const std::string &enum_val) const {
+    const IDLOptions &opts = parser_.opts;
     return opts.prefixed_enums ? enum_def.name + "_" + enum_val : enum_val;
   }
 
-  static std::string GetEnumValUse(const EnumDef &enum_def,
-                                   const EnumVal &enum_val,
-                                   const IDLOptions &opts) {
+  std::string GetEnumValUse(const EnumDef &enum_def,
+                            const EnumVal &enum_val) const {
+    const IDLOptions &opts = parser_.opts;
     if (opts.scoped_enums) {
       return enum_def.name + "::" + enum_val.name;
     } else if (opts.prefixed_enums) {
@@ -382,13 +412,14 @@ class CppGenerator : public BaseGenerator {
     }
   }
 
-  std::string UnionVerifySignature(EnumDef &enum_def) {
+  static std::string UnionVerifySignature(const EnumDef &enum_def) {
     return "inline bool Verify" + enum_def.name +
            "(flatbuffers::Verifier &verifier, const void *union_obj, " +
            enum_def.name + " type)";
   }
 
-  std::string UnionUnPackSignature(EnumDef &enum_def, bool inclass) {
+  static std::string UnionUnPackSignature(const EnumDef &enum_def,
+                                          bool inclass) {
     return (inclass ? "static " : "") +
            std::string("flatbuffers::NativeTable *") +
            (inclass ? "" : enum_def.name + "Union::") +
@@ -396,7 +427,7 @@ class CppGenerator : public BaseGenerator {
            " type, const flatbuffers::resolver_function_t *resolver)";
   }
 
-  std::string UnionPackSignature(EnumDef &enum_def, bool inclass) {
+  static std::string UnionPackSignature(const EnumDef &enum_def, bool inclass) {
     return "flatbuffers::Offset<void> " +
            (inclass ? "" : enum_def.name + "Union::") +
            "Pack(flatbuffers::FlatBufferBuilder &_fbb, " +
@@ -404,7 +435,8 @@ class CppGenerator : public BaseGenerator {
            (inclass ? " = nullptr" : "") + ") const";
   }
 
-  std::string TableCreateSignature(StructDef &struct_def, bool predecl) {
+  static std::string TableCreateSignature(const StructDef &struct_def,
+                                          bool predecl) {
     return "inline flatbuffers::Offset<" + struct_def.name + "> Create" +
            struct_def.name  +
            "(flatbuffers::FlatBufferBuilder &_fbb, const " +
@@ -413,7 +445,8 @@ class CppGenerator : public BaseGenerator {
            (predecl ? " = nullptr" : "") + ")";
   }
 
-  std::string TablePackSignature(StructDef &struct_def, bool inclass) {
+  static std::string TablePackSignature(const StructDef &struct_def,
+                                        bool inclass) {
     return std::string(inclass ? "static " : "") +
            "flatbuffers::Offset<" + struct_def.name + "> " +
            (inclass ? "" : struct_def.name + "::") +
@@ -423,7 +456,8 @@ class CppGenerator : public BaseGenerator {
            (inclass ? " = nullptr" : "") + ")";
   }
 
-  std::string TableUnPackSignature(StructDef &struct_def, bool inclass) {
+  static std::string TableUnPackSignature(const StructDef &struct_def,
+                                          bool inclass) {
     return NativeName(struct_def.name) + " *" +
            (inclass ? "" : struct_def.name + "::") +
            "UnPack(const flatbuffers::resolver_function_t *resolver" +
@@ -431,20 +465,20 @@ class CppGenerator : public BaseGenerator {
   }
 
   // Generate an enum declaration and an enum string lookup table.
-  void GenEnum(EnumDef &enum_def, std::string *code_ptr) {
+  void GenEnum(const EnumDef &enum_def, std::string *code_ptr) {
     std::string &code = *code_ptr;
     GenComment(enum_def.doc_comment, code_ptr, nullptr);
-    code += GenEnumDecl(enum_def, parser_.opts);
+    code += GenEnumDecl(enum_def);
     if (parser_.opts.scoped_enums)
       code += " : " + GenTypeBasic(enum_def.underlying_type, false);
     code += " {\n";
     int64_t anyv = 0;
-    EnumVal *minv = nullptr, *maxv = nullptr;
+    const EnumVal *minv = nullptr, *maxv = nullptr;
     for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
          ++it) {
-      auto &ev = **it;
+      const auto &ev = **it;
       GenComment(ev.doc_comment, code_ptr, nullptr, "  ");
-      code += "  " + GenEnumValDecl(enum_def, ev.name, parser_.opts) + " = ";
+      code += "  " + GenEnumValDecl(enum_def, ev.name) + " = ";
       code += NumToString(ev.value);
       if (it != enum_def.vals.vec.end() - 1) code += ",\n";
       minv = !minv || minv->value > ev.value ? &ev : minv;
@@ -455,18 +489,23 @@ class CppGenerator : public BaseGenerator {
       assert(minv && maxv);
       if (enum_def.attributes.Lookup("bit_flags")) {
         if (minv->value != 0)  // If the user didn't defined NONE value
-          code += ",\n  " + GenEnumValDecl(enum_def, "NONE", parser_.opts) + " = 0";
+          code += ",\n";
+          code += "  " + GenEnumValDecl(enum_def, "NONE") + " = 0";
         if (maxv->value != anyv)  // If the user didn't defined ANY value
-          code += ",\n  " + GenEnumValDecl(enum_def, "ANY", parser_.opts) + " = " +
+          code += ",\n";
+          code += "  " + GenEnumValDecl(enum_def, "ANY") + " = " +
                   NumToString(anyv);
       } else {  // MIN & MAX are useless for bit_flags
-        code += ",\n  " + GenEnumValDecl(enum_def, "MIN", parser_.opts) + " = ";
-        code += GenEnumValDecl(enum_def, minv->name, parser_.opts);
-        code += ",\n  " + GenEnumValDecl(enum_def, "MAX", parser_.opts) + " = ";
-        code += GenEnumValDecl(enum_def, maxv->name, parser_.opts);
+        code += ",\n";
+        code += "  " + GenEnumValDecl(enum_def, "MIN") + " = ";
+        code += GenEnumValDecl(enum_def, minv->name);
+        code += ",\n";
+        code += "  " + GenEnumValDecl(enum_def, "MAX") + " = ";
+        code += GenEnumValDecl(enum_def, maxv->name);
       }
     }
-    code += "\n};\n";
+    code += "\n";
+    code += "};\n";
     if (parser_.opts.scoped_enums && enum_def.attributes.Lookup("bit_flags"))
       code += "DEFINE_BITMASK_OPERATORS(" + enum_def.name + ", " +
               GenTypeBasic(enum_def.underlying_type, false) + ")\n";
@@ -488,17 +527,19 @@ class CppGenerator : public BaseGenerator {
       auto val = enum_def.vals.vec.front()->value;
       for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
            ++it) {
-        while (val++ != (*it)->value) code += "\"\", ";
-        code += "\"" + (*it)->name + "\", ";
+        const auto &ev = **it;
+        while (val++ != ev.value) code += "\"\", ";
+        code += "\"" + ev.name + "\", ";
       }
-      code += "nullptr };\n  return names;\n}\n\n";
+      code += "nullptr };\n";
+      code += "  return names;\n";
+      code += "}\n\n";
       code += "inline const char *EnumName" + enum_def.name;
       code += "(" + enum_def.name + " e) { return EnumNames" + enum_def.name;
       code += "()[static_cast<int>(e)";
       if (enum_def.vals.vec.front()->value) {
         code += " - static_cast<int>(";
-        code += GetEnumValUse(enum_def, *enum_def.vals.vec.front(), parser_.opts) +
-                ")";
+        code += GetEnumValUse(enum_def, *enum_def.vals.vec.front()) + ")";
       }
       code += "]; }\n\n";
     }
@@ -508,7 +549,7 @@ class CppGenerator : public BaseGenerator {
       for (auto it = enum_def.vals.vec.begin();
         it != enum_def.vals.vec.end();
         ++it) {
-        auto &ev = **it;
+        const auto &ev = **it;
         if (it == enum_def.vals.vec.begin()) {
           code += "template<typename T> struct " + enum_def.name + "Traits {\n";
         }
@@ -517,7 +558,7 @@ class CppGenerator : public BaseGenerator {
                   WrapInNameSpace(*ev.struct_def) + "> {\n";
         }
         code += "  static const " + enum_def.name + " enum_value = " +
-                GetEnumValUse(enum_def, ev, parser_.opts) + ";\n";
+                GetEnumValUse(enum_def, ev) + ";\n";
         code += "};\n\n";
       }
     }
@@ -526,9 +567,9 @@ class CppGenerator : public BaseGenerator {
       // Generate a union type
       code += "struct " + enum_def.name + "Union {\n";
       code += "  " + enum_def.name + " type;\n\n";
-      code += "  flatbuffers::NativeTable *table;\n";
+      code += "  flatbuffers::NativeTable *table = nullptr;\n";
       code += "  " + enum_def.name + "Union() : type(";
-      code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"), parser_.opts);
+      code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"));
       code += "), table(nullptr) {}\n";
       code += "  " + enum_def.name + "Union(const ";
       code += enum_def.name + "Union &);\n";
@@ -536,13 +577,14 @@ class CppGenerator : public BaseGenerator {
       code += enum_def.name + "Union &);\n";
       code += "  ~" + enum_def.name + "Union() { Reset(); }\n";
       code += "  void Reset();\n\n";
+
       code += "  template <typename T>\n";
       code += "  void Set(T&& value) {\n";
       code += "    Reset();\n";
       code += "    type = " + enum_def.name;
       code += "Traits<typename T::TableType>::enum_value;\n";
       code += "    if (type != ";
-      code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"), parser_.opts);
+      code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"));
       code += ") {\n";
       code += "      table = new T(std::forward<T>(value));\n";
       code += "    }\n";
@@ -551,12 +593,12 @@ class CppGenerator : public BaseGenerator {
       code += "  " + UnionPackSignature(enum_def, true) + ";\n\n";
       for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
            ++it) {
-        auto &ev = **it;
+        const auto &ev = **it;
         if (ev.value) {
           auto native_name = NativeName(WrapInNameSpace(*ev.struct_def));
           code += "  " + native_name + " *As";
           code += ev.name + "() { return type == ";
-          code += GetEnumValUse(enum_def, ev, parser_.opts);
+          code += GetEnumValUse(enum_def, ev);
           code += " ? reinterpret_cast<" + native_name;
           code += " *>(table) : nullptr; }\n";
         }
@@ -569,18 +611,19 @@ class CppGenerator : public BaseGenerator {
     }
   }
 
-  void GenUnionPost(EnumDef &enum_def, std::string *code_ptr) {
+  void GenUnionPost(const EnumDef &enum_def, std::string *code_ptr) {
     // Generate a verifier function for this union that can be called by the
     // table verifier functions. It uses a switch case to select a specific
     // verifier function to call, this should be safe even if the union type
     // has been corrupted, since the verifiers will simply fail when called
     // on the wrong type.
     std::string &code = *code_ptr;
-    code += UnionVerifySignature(enum_def) + " {\n  switch (type) {\n";
+    code += UnionVerifySignature(enum_def) + " {\n";
+    code += "  switch (type) {\n";
     for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
          ++it) {
-      auto &ev = **it;
-      code += "    case " + GetEnumValUse(enum_def, ev, parser_.opts);
+      const auto &ev = **it;
+      code += "    case " + GetEnumValUse(enum_def, ev);
       if (!ev.value) {
         code += ": return true;\n";  // "NONE" enum value.
       } else {
@@ -589,16 +632,19 @@ class CppGenerator : public BaseGenerator {
         code += " *>(union_obj));\n";
       }
     }
-    code += "    default: return false;\n  }\n}\n\n";
+    code += "    default: return false;\n";
+    code += "  }\n";
+    code += "}\n\n";
 
     if (parser_.opts.generate_object_based_api) {
       // Generate a union pack & unpack function.
       code += "inline " + UnionUnPackSignature(enum_def, false);
-      code += " {\n  switch (type) {\n";
+      code += " {\n";
+      code += "  switch (type) {\n";
       for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
            ++it) {
-        auto &ev = **it;
-        code += "    case " + GetEnumValUse(enum_def, ev, parser_.opts);
+        const auto &ev = **it;
+        code += "    case " + GetEnumValUse(enum_def, ev);
         if (!ev.value) {
           code += ": return nullptr;\n";  // "NONE" enum value.
         } else {
@@ -607,13 +653,15 @@ class CppGenerator : public BaseGenerator {
           code += " *>(union_obj)->UnPack(resolver);\n";
         }
       }
-      code += "    default: return nullptr;\n  }\n}\n\n";
-      code += "inline " + UnionPackSignature(enum_def, false);
-      code += " {\n  switch (type) {\n";
+      code += "    default: return nullptr;\n";
+      code += "  }\n";
+      code += "}\n\n";
+      code += "inline " + UnionPackSignature(enum_def, false) + " {\n";
+      code += "  switch (type) {\n";
       for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
            ++it) {
         auto &ev = **it;
-        code += "    case " + GetEnumValUse(enum_def, ev, parser_.opts);
+        code += "    case " + GetEnumValUse(enum_def, ev);
         if (!ev.value) {
           code += ": return 0;\n";  // "NONE" enum value.
         } else {
@@ -623,16 +671,18 @@ class CppGenerator : public BaseGenerator {
           code += " *>(table), rehasher).Union();\n";
         }
       }
-      code += "    default: return 0;\n  }\n}\n\n";
+      code += "    default: return 0;\n";
+      code += "  }\n";
+      code += "}\n\n";
 
       // Generate a union destructor.
       code += "inline void " + enum_def.name + "Union::Reset() {\n";
       code += "  switch (type) {\n";
       for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
            ++it) {
-        auto &ev = **it;
+        const auto &ev = **it;
         if (ev.value) {
-          code += "    case " + GetEnumValUse(enum_def, ev, parser_.opts);
+          code += "    case " + GetEnumValUse(enum_def, ev);
           code += ": delete reinterpret_cast<";
           code += NativeName(WrapInNameSpace(*ev.struct_def));
           code += " *>(table); break;\n";
@@ -642,7 +692,7 @@ class CppGenerator : public BaseGenerator {
       code += "  }\n";
       code += "  table = nullptr;\n";
       code += "  type = ";
-      code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"), parser_.opts);
+      code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"));
       code += ";\n";
       code += "}\n\n";
     }
@@ -672,7 +722,9 @@ class CppGenerator : public BaseGenerator {
     return "VT_" + uname;
   }
 
-  void GenFullyQualifiedNameGetter(const std::string &name, std::string &code) {
+  void GenFullyQualifiedNameGetter(const std::string &name,
+                                   std::string *code_ptr) {
+    std::string &code = *code_ptr;
     if (parser_.opts.generate_name_strings) {
       code +=
           "  static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() "
@@ -696,7 +748,7 @@ class CppGenerator : public BaseGenerator {
       if (ev) {
         return WrapInNameSpace(
             field.value.type.enum_def->defined_namespace,
-            GetEnumValUse(*field.value.type.enum_def, *ev, parser_.opts));
+            GetEnumValUse(*field.value.type.enum_def, *ev));
       } else {
         return GenUnderlyingCast(field, true, field.value.constant);
       }
@@ -707,13 +759,16 @@ class CppGenerator : public BaseGenerator {
     }
   }
 
-  void GenSimpleParam(std::string &code, FieldDef &field) {
-    code += ",\n    " + GenTypeWire(field.value.type, " ", true);
+  void GenSimpleParam(const FieldDef &field, std::string *code_ptr) {
+    std::string &code = *code_ptr;
+    code += ",\n";
+    code += "    " + GenTypeWire(field.value.type, " ", true);
     code += field.name + " = " + GetDefaultScalarValue(field);
   }
 
   // Generate a member, including a default value for scalars and raw pointers.
-  void GenMember(std::string& code, const FieldDef &field) {
+  void GenMember(const FieldDef &field, std::string *code_ptr) {
+    std::string &code = *code_ptr;
     if (!field.deprecated &&  // Deprecated fields won't be accessible.
         field.value.type.base_type != BASE_TYPE_UTYPE) {
       auto type = GenTypeNative(field.value.type, false, field);
@@ -725,12 +780,14 @@ class CppGenerator : public BaseGenerator {
 
   // Generate the default constructor for this struct. Properly initialize all
   // scalar members with default values.
-  void GenDefaultConstructor(std::string& code, const StructDef& struct_def) {
+  void GenDefaultConstructor(const StructDef& struct_def,
+                             std::string *code_ptr) {
+    std::string &code = *code_ptr;
     code += "  " + NativeName(struct_def.name) + "()";
     std::string initializer_list;
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       if (!field.deprecated &&  // Deprecated fields won't be accessible.
           field.value.type.base_type != BASE_TYPE_UTYPE) {
         auto cpp_type = field.attributes.Lookup("cpp_type");
@@ -739,24 +796,26 @@ class CppGenerator : public BaseGenerator {
           if (!initializer_list.empty()) {
             initializer_list += ",\n      ";
           }
-          initializer_list += field.name + "(" +GetDefaultScalarValue(field) +
-              ")";
+          initializer_list += field.name;
+          initializer_list += "(" + GetDefaultScalarValue(field) + ")";
         } else if (cpp_type) {
           if (!initializer_list.empty()) {
-            code += ",\n      ";
+            code += ",\n";
+            code += "      ";
           }
           initializer_list += field.name + "(0)";
         }
       }
     }
     if (!initializer_list.empty()) {
-      code += "\n    : " + initializer_list;
+      code += "\n";
+      code += "    : " + initializer_list;
     }
     code += " {}\n";
   }
 
   // Generate an accessor struct, builder structs & function for a table.
-  void GenTable(StructDef &struct_def, std::string *code_ptr) {
+  void GenTable(const StructDef &struct_def, std::string *code_ptr) {
     std::string &code = *code_ptr;
 
     if (parser_.opts.generate_object_based_api) {
@@ -766,13 +825,13 @@ class CppGenerator : public BaseGenerator {
       code += " : public flatbuffers::NativeTable {\n";
       code += "  typedef " + struct_def.name + " TableType;\n";
       // Generate GetFullyQualifiedName
-      GenFullyQualifiedNameGetter(NativeName(struct_def.name), code);
+      GenFullyQualifiedNameGetter(NativeName(struct_def.name), &code);
       for (auto it = struct_def.fields.vec.begin();
            it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
-        GenMember(code, field);
+        const auto &field = **it;
+        GenMember(field, &code);
       }
-      GenDefaultConstructor(code, struct_def);
+      GenDefaultConstructor(struct_def, &code);
       code += "};\n\n";
     }
 
@@ -787,7 +846,7 @@ class CppGenerator : public BaseGenerator {
               " NativeTableType;\n";
     }
     // Generate GetFullyQualifiedName
-    GenFullyQualifiedNameGetter(struct_def.name, code);
+    GenFullyQualifiedNameGetter(struct_def.name, &code);
     // Generate field id constants.
     if (struct_def.fields.vec.size() > 0) {
       code += "  enum {\n";
@@ -795,7 +854,7 @@ class CppGenerator : public BaseGenerator {
           true;  // track the first field that's not deprecated
       for (auto it = struct_def.fields.vec.begin();
            it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
+        const auto &field = **it;
         if (!field.deprecated) {  // Deprecated fields won't be accessible.
           if (!is_first_field) {
             // Add trailing comma and newline to previous element. Don't add
@@ -809,12 +868,13 @@ class CppGenerator : public BaseGenerator {
           code += NumToString(field.value.offset);
         }
       }
-      code += "\n  };\n";
+      code += "\n";
+      code += "  };\n";
     }
     // Generate the accessors.
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       if (!field.deprecated) {  // Deprecated fields won't be accessible.
         auto is_scalar = IsScalar(field.value.type.base_type);
         GenComment(field.doc_comment, code_ptr, nullptr, "  ");
@@ -897,7 +957,7 @@ class CppGenerator : public BaseGenerator {
     std::string prefix = " &&\n           ";
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       if (!field.deprecated) {
         code += prefix + "VerifyField";
         if (field.required) code += "Required";
@@ -944,7 +1004,8 @@ class CppGenerator : public BaseGenerator {
       }
     }
     code += prefix + "verifier.EndTable()";
-    code += ";\n  }\n";
+    code += ";\n";
+    code += "  }\n";
 
     if (parser_.opts.generate_object_based_api) {
       // Generate the UnPack() pre declaration.
@@ -955,31 +1016,35 @@ class CppGenerator : public BaseGenerator {
     code += "};\n\n";  // End of table.
 
     // Generate a builder struct, with methods of the form:
-    // void add_name(type name) { fbb_.AddElement<type>(offset, name, default);
+    // void add_name(type name) {
+    //   fbb_.AddElement<type>(offset, name, default);
     // }
-    code += "struct " + struct_def.name;
-    code += "Builder {\n  flatbuffers::FlatBufferBuilder &fbb_;\n";
+    code += "struct " + struct_def.name + "Builder {\n";
+    code += "  flatbuffers::FlatBufferBuilder &fbb_;\n";
     code += "  flatbuffers::uoffset_t start_;\n";
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       if (!field.deprecated) {
         code += "  void add_" + field.name + "(";
         code += GenTypeWire(field.value.type, " ", true) + field.name;
-        code += ") { fbb_.Add";
+        code += ") {\n";
+
+        code += "    fbb_.Add";
         if (IsScalar(field.value.type.base_type)) {
-          code += "Element<" + GenTypeWire(field.value.type, "", false);
-          code += ">";
+          code += "Element<" + GenTypeWire(field.value.type, "", false) + ">";
         } else if (IsStruct(field.value.type)) {
           code += "Struct";
         } else {
           code += "Offset";
         }
+
         code += "(" + struct_def.name + "::" + GenFieldOffsetName(field) + ", ";
         code += GenUnderlyingCast(field, false, field.name);
         if (IsScalar(field.value.type.base_type))
           code += ", " + GenDefaultConstant(field);
-        code += "); }\n";
+        code += ");\n";
+        code += "  }\n";
       }
     }
     code += "  " + struct_def.name;
@@ -988,19 +1053,22 @@ class CppGenerator : public BaseGenerator {
     code += "  " + struct_def.name + "Builder &operator=(const ";
     code += struct_def.name + "Builder &);\n";
     code += "  flatbuffers::Offset<" + struct_def.name;
-    code += "> Finish() {\n    auto o = flatbuffers::Offset<" + struct_def.name;
+    code += "> Finish() {\n";
+    code += "    auto o = flatbuffers::Offset<" + struct_def.name;
     code += ">(fbb_.EndTable(start_, ";
     code += NumToString(struct_def.fields.vec.size()) + "));\n";
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       if (!field.deprecated && field.required) {
         code += "    fbb_.Required(o, ";
         code += struct_def.name + "::" + GenFieldOffsetName(field);
         code += ");  // " + field.name + "\n";
       }
     }
-    code += "    return o;\n  }\n};\n\n";
+    code += "    return o;\n";
+    code += "  }\n";
+    code += "};\n\n";
 
     // Generate a convenient CreateX function that uses the above builder
     // to create a table in one go.
@@ -1010,28 +1078,30 @@ class CppGenerator : public BaseGenerator {
     code += "(flatbuffers::FlatBufferBuilder &_fbb";
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       if (!field.deprecated) {
         if (field.value.type.base_type == BASE_TYPE_STRING ||
             field.value.type.base_type == BASE_TYPE_VECTOR) {
           gen_vector_pars = true;
         }
-        GenSimpleParam(code, field);
+        GenSimpleParam(field, &code);
       }
     }
-    code += ") {\n  " + struct_def.name + "Builder builder_(_fbb);\n";
+    code += ") {\n";
+    code += "  " + struct_def.name + "Builder builder_(_fbb);\n";
     for (size_t size = struct_def.sortbysize ? sizeof(largest_scalar_t) : 1;
          size; size /= 2) {
       for (auto it = struct_def.fields.vec.rbegin();
            it != struct_def.fields.vec.rend(); ++it) {
-        auto &field = **it;
+        const auto &field = **it;
         if (!field.deprecated && (!struct_def.sortbysize ||
                                   size == SizeOf(field.value.type.base_type))) {
           code += "  builder_.add_" + field.name + "(" + field.name + ");\n";
         }
       }
     }
-    code += "  return builder_.Finish();\n}\n\n";
+    code += "  return builder_.Finish();\n";
+    code += "}\n\n";
 
     // Generate a CreateXDirect function with vector types as parameters
     if (gen_vector_pars) {
@@ -1040,27 +1110,27 @@ class CppGenerator : public BaseGenerator {
       code += "Direct(flatbuffers::FlatBufferBuilder &_fbb";
       for (auto it = struct_def.fields.vec.begin();
            it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
+        const auto &field = **it;
         if (!field.deprecated) {
           if (field.value.type.base_type == BASE_TYPE_STRING) {
-            code += ",\n    const char *";
+            code += ",\n";
+            code += "    const char *";
             code += field.name + " = nullptr";
           } else if (field.value.type.base_type == BASE_TYPE_VECTOR) {
-            code += ",\n    const std::vector<";
+            code += ",\n";
+            code += "    const std::vector<";
             code += GenTypeWire(field.value.type.VectorType(), "", false);
             code += "> *" + field.name + " = nullptr";
           } else {
-            GenSimpleParam(code, field);
+            GenSimpleParam(field, &code);
           }
         }
       }
-      code += ") {\n  ";
-      code += "return Create";
-      code += struct_def.name;
-      code += "(_fbb";
+      code += ") {\n";
+      code += "  return Create" + struct_def.name + "(_fbb";
       for (auto it = struct_def.fields.vec.begin();
            it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
+        const auto &field = **it;
         if (!field.deprecated) {
           if (field.value.type.base_type == BASE_TYPE_STRING) {
             code += ", " + field.name + " ? ";
@@ -1075,7 +1145,8 @@ class CppGenerator : public BaseGenerator {
           }
         }
       }
-      code += ");\n}\n\n";
+      code += ");\n";
+      code += "}\n\n";
     }
 
     if (parser_.opts.generate_object_based_api) {
@@ -1088,31 +1159,32 @@ class CppGenerator : public BaseGenerator {
   std::string GenUnpackVal(const Type &type, const std::string &val,
                            bool invector, const FieldDef &afield) {
     switch (type.base_type) {
-      case BASE_TYPE_STRING:
+      case BASE_TYPE_STRING: {
         return val + "->str()";
-      case BASE_TYPE_STRUCT:
+      }
+      case BASE_TYPE_STRUCT: {
+        const auto name = WrapInNameSpace(*type.struct_def);
         if (IsStruct(type)) {
           if (invector || afield.native_inline) {
             return "*" + val;
           } else {
-            return GenTypeNativePtr(WrapInNameSpace(*type.struct_def),
-                                    &afield, true) +
-                   "(new " +
-                   WrapInNameSpace(*type.struct_def) + "(*" + val + "))";
+            const auto ptype = GenTypeNativePtr(name, &afield, true);
+            return ptype + "(new " + name + "(*" + val + "))";
           }
         } else {
-          return GenTypeNativePtr(NativeName(WrapInNameSpace(
-                     *type.struct_def)), &afield, true) +
-                 "(" + val + "->UnPack(resolver))";
+          const auto ptype = GenTypeNativePtr(NativeName(name), &afield, true);
+          return ptype + "(" + val + "->UnPack(resolver))";
         }
-      default:
+      }
+      default: {
         return val;
         break;
+      }
     }
   };
 
   // Generate code for tables that needs to come after the regular definition.
-  void GenTablePost(StructDef &struct_def, std::string *code_ptr) {
+  void GenTablePost(const StructDef &struct_def, std::string *code_ptr) {
     std::string &code = *code_ptr;
 
     if (parser_.opts.generate_object_based_api) {
@@ -1122,7 +1194,7 @@ class CppGenerator : public BaseGenerator {
       code += "  auto _o = new " + NativeName(struct_def.name) + "();\n";
       for (auto it = struct_def.fields.vec.begin();
            it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
+        const auto &field = **it;
         if (!field.deprecated) {
           auto prefix = "  { auto _e = " + field.name + "(); ";
           if (!IsScalar(field.value.type.base_type)) prefix += "if (_e) ";
@@ -1179,7 +1251,8 @@ class CppGenerator : public BaseGenerator {
           code += " };\n";
         }
       }
-      code += "  return _o;\n}\n\n";
+      code += "  return _o;\n";
+      code += "}\n\n";
 
       // Generate the X::Pack member function that simply calls the global
       // CreateX function.
@@ -1219,7 +1292,8 @@ class CppGenerator : public BaseGenerator {
             stlprefix = "";
             postfix = "";
           }
-          code += ",\n    ";
+          code += ",\n";
+          code += "    ";
           switch (field.value.type.base_type) {
             case BASE_TYPE_STRING:
               code += stlprefix + "_fbb.CreateString(" + accessor + ")";
@@ -1285,41 +1359,40 @@ class CppGenerator : public BaseGenerator {
           }
         }
       }
-      code += ");\n}\n\n";
+      code += ");\n";
+      code += "}\n\n";
       if (!any_fields) code.insert(before_return_statement, "  (void)_o;\n");
     }
   }
 
-  static void GenPadding(const FieldDef &field, std::string &code,
-                         int &padding_id,
-                         const std::function<void(int bits, std::string &code,
-                                                  int &padding_id)> &f) {
+  static void GenPadding(
+      const FieldDef &field, std::string *code_ptr, int *id,
+      const std::function<void(int bits, std::string *code_ptr, int *id)> &f) {
     if (field.padding) {
       for (int i = 0; i < 4; i++)
         if (static_cast<int>(field.padding) & (1 << i))
-          f((1 << i) * 8, code, padding_id);
+          f((1 << i) * 8, code_ptr, id);
       assert(!(field.padding & ~0xF));
     }
   }
 
-  static void PaddingDefinition(int bits, std::string &code, int &padding_id) {
-    code += "  int" + NumToString(bits) + "_t __padding" +
-            NumToString(padding_id++) + ";\n";
+  static void PaddingDefinition(int bits, std::string *code_ptr, int *id) {
+    *code_ptr += "  int" + NumToString(bits) + "_t __padding" +
+        NumToString((*id)++) + ";\n";
   }
 
-  static void PaddingDeclaration(int bits, std::string &code, int &padding_id) {
+  static void PaddingDeclaration(int bits, std::string *code_ptr, int *id) {
     (void)bits;
-    code += " (void)__padding" + NumToString(padding_id++) + ";";
+    *code_ptr += " (void)__padding" + NumToString((*id)++) + ";";
   }
 
-  static void PaddingInitializer(int bits, std::string &code, int &padding_id) {
+  static void PaddingInitializer(int bits, std::string *code_ptr, int *id) {
     (void)bits;
-    code += ", __padding" + NumToString(padding_id++) + "(0)";
+    *code_ptr += ", __padding" + NumToString((*id)++) + "(0)";
   }
 
   // Generate an accessor struct with constructor for a flatbuffers struct.
-  void GenStruct(StructDef &struct_def, std::string *code_ptr) {
-    if (struct_def.generated) return;
+  void GenStruct(const StructDef &struct_def, std::string *code_ptr) {
     std::string &code = *code_ptr;
 
     // Generate an accessor struct, with private variables of the form:
@@ -1330,19 +1403,21 @@ class CppGenerator : public BaseGenerator {
     GenComment(struct_def.doc_comment, code_ptr, nullptr);
     code +=
         "MANUALLY_ALIGNED_STRUCT(" + NumToString(struct_def.minalign) + ") ";
-    code += struct_def.name + " FLATBUFFERS_FINAL_CLASS {\n private:\n";
+    code += struct_def.name + " FLATBUFFERS_FINAL_CLASS {\n";
+    code += " private:\n";
     int padding_id = 0;
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       code += "  " + GenTypeGet(field.value.type, " ", "", " ", false);
       code += field.name + "_;\n";
-      GenPadding(field, code, padding_id, PaddingDefinition);
+      GenPadding(field, &code, &padding_id, PaddingDefinition);
     }
 
     // Generate GetFullyQualifiedName
-    code += "\n public:\n";
-    GenFullyQualifiedNameGetter(struct_def.name, code);
+    code += "\n";
+    code += " public:\n";
+    GenFullyQualifiedNameGetter(struct_def.name, &code);
 
     // Generate a default constructor.
     code += "  " + struct_def.name + "() { memset(this, 0, sizeof(";
@@ -1354,46 +1429,46 @@ class CppGenerator : public BaseGenerator {
     code += struct_def.name + ")); }\n";
 
     // Generate a constructor that takes all fields as arguments.
-    if (struct_def.fields.vec.size()) {
-      code += "  " + struct_def.name + "(";
-      for (auto it = struct_def.fields.vec.begin();
-           it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
-        if (it != struct_def.fields.vec.begin()) code += ", ";
-        code += GenTypeGet(field.value.type, " ", "const ", " &", true);
-        code += "_" + field.name;
-      }
-      code += ")\n    : ";
-      padding_id = 0;
-      for (auto it = struct_def.fields.vec.begin();
-           it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
-        if (it != struct_def.fields.vec.begin()) code += ", ";
-        code += field.name + "_(";
-        if (IsScalar(field.value.type.base_type)) {
-          code += "flatbuffers::EndianScalar(";
-          code += GenUnderlyingCast(field, false, "_" + field.name);
-          code += "))";
-        } else {
-          code += "_" + field.name + ")";
-        }
-        GenPadding(field, code, padding_id, PaddingInitializer);
-      }
-      code += " {";
-      padding_id = 0;
-      for (auto it = struct_def.fields.vec.begin();
-           it != struct_def.fields.vec.end(); ++it) {
-        auto &field = **it;
-        GenPadding(field, code, padding_id, PaddingDeclaration);
+    code += "  " + struct_def.name + "(";
+    for (auto it = struct_def.fields.vec.begin();
+         it != struct_def.fields.vec.end(); ++it) {
+      const auto &field = **it;
+      if (it != struct_def.fields.vec.begin()) code += ", ";
+      code += GenTypeGet(field.value.type, " ", "const ", " &", true);
+      code += "_" + field.name;
+    }
+    code += ")\n";
+    code += "    : ";
+    padding_id = 0;
+    for (auto it = struct_def.fields.vec.begin();
+         it != struct_def.fields.vec.end(); ++it) {
+      const auto &field = **it;
+      if (it != struct_def.fields.vec.begin()) code += ", ";
+      code += field.name + "_(";
+      if (IsScalar(field.value.type.base_type)) {
+        code += "flatbuffers::EndianScalar(";
+        code += GenUnderlyingCast(field, false, "_" + field.name);
+        code += "))";
+      } else {
+        code += "_" + field.name + ")";
       }
-      code += " }\n\n";
+      GenPadding(field, &code, &padding_id, PaddingInitializer);
+    }
+
+    code += " {";
+    padding_id = 0;
+    for (auto it = struct_def.fields.vec.begin();
+         it != struct_def.fields.vec.end(); ++it) {
+      auto field = *it;
+      GenPadding(*field, &code, &padding_id, PaddingDeclaration);
     }
+    code += " }\n\n";
 
     // Generate accessor methods of the form:
     // type name() const { return flatbuffers::EndianScalar(name_); }
     for (auto it = struct_def.fields.vec.begin();
          it != struct_def.fields.vec.end(); ++it) {
-      auto &field = **it;
+      const auto &field = **it;
       GenComment(field.doc_comment, code_ptr, nullptr, "  ");
       auto is_scalar = IsScalar(field.value.type.base_type);
       code += "  " + GenTypeGet(field.value.type, " ", "const ", " &", true);
@@ -1419,15 +1494,16 @@ class CppGenerator : public BaseGenerator {
         }
       }
     }
-    code += "};\nSTRUCT_END(" + struct_def.name + ", ";
+    code += "};\n";
+    code += "STRUCT_END(" + struct_def.name + ", ";
     code += NumToString(struct_def.bytesize) + ");\n\n";
   }
 
-  // Set up the correct namespace. Only open a namespace if
-  // the existing one is different (closing/opening only what is necessary) :
+  // Set up the correct namespace. Only open a namespace if the existing one is
+  // different (closing/opening only what is necessary).
   //
-  // the file must start and end with an empty (or null) namespace
-  // so that namespaces are properly opened and closed
+  // The file must start and end with an empty (or null) namespace so that
+  // namespaces are properly opened and closed.
   void SetNameSpace(const Namespace *ns, std::string *code_ptr) {
     if (cur_name_space_ == ns) return;
     // compute the size of the longest common namespace prefix.
@@ -1467,10 +1543,10 @@ bool GenerateCPP(const Parser &parser, const std::string &path,
 
 std::string CPPMakeRule(const Parser &parser, const std::string &path,
                         const std::string &file_name) {
-  std::string filebase =
+  const std::string filebase =
       flatbuffers::StripPath(flatbuffers::StripExtension(file_name));
+  const auto included_files = parser.GetIncludedFilesRecursive(file_name);
   std::string make_rule = GeneratedFileName(path, filebase) + ": ";
-  auto included_files = parser.GetIncludedFilesRecursive(file_name);
   for (auto it = included_files.begin(); it != included_files.end(); ++it) {
     make_rule += " " + *it;
   }
diff --git a/src/idl_gen_general.cpp b/src/idl_gen_general.cpp
index 2d8d83cf..44d89b4c 100644
--- a/src/idl_gen_general.cpp
+++ b/src/idl_gen_general.cpp
@@ -276,7 +276,7 @@ class GeneralGenerator : public BaseGenerator {
     return SaveFile(filename.c_str(), code, false);
   }
 
-  const Namespace *CurrentNameSpace() { return cur_name_space_; }
+  const Namespace *CurrentNameSpace() const { return cur_name_space_; }
 
   std::string FunctionStart(char upper) {
     return std::string() + (lang_.language == IDLOptions::kJava
diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h
index 0b73b7a2..bbe4487b 100644
--- a/tests/monster_test_generated.h
+++ b/tests/monster_test_generated.h
@@ -78,7 +78,7 @@ template<> struct AnyTraits<MyGame::Example2::Monster> {
 struct AnyUnion {
   Any type;
 
-  flatbuffers::NativeTable *table;
+  flatbuffers::NativeTable *table = nullptr;
   AnyUnion() : type(Any_NONE), table(nullptr) {}
   AnyUnion(const AnyUnion &);
   AnyUnion &operator=(const AnyUnion &);
@@ -223,7 +223,9 @@ struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Ta
 struct TestSimpleTableWithEnumBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_color(Color color) { fbb_.AddElement<int8_t>(TestSimpleTableWithEnum::VT_COLOR, static_cast<int8_t>(color), 2); }
+  void add_color(Color color) {
+    fbb_.AddElement<int8_t>(TestSimpleTableWithEnum::VT_COLOR, static_cast<int8_t>(color), 2);
+  }
   TestSimpleTableWithEnumBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   TestSimpleTableWithEnumBuilder &operator=(const TestSimpleTableWithEnumBuilder &);
   flatbuffers::Offset<TestSimpleTableWithEnum> Finish() {
@@ -279,9 +281,15 @@ struct Stat FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct StatBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_id(flatbuffers::Offset<flatbuffers::String> id) { fbb_.AddOffset(Stat::VT_ID, id); }
-  void add_val(int64_t val) { fbb_.AddElement<int64_t>(Stat::VT_VAL, val, 0); }
-  void add_count(uint16_t count) { fbb_.AddElement<uint16_t>(Stat::VT_COUNT, count, 0); }
+  void add_id(flatbuffers::Offset<flatbuffers::String> id) {
+    fbb_.AddOffset(Stat::VT_ID, id);
+  }
+  void add_val(int64_t val) {
+    fbb_.AddElement<int64_t>(Stat::VT_VAL, val, 0);
+  }
+  void add_count(uint16_t count) {
+    fbb_.AddElement<uint16_t>(Stat::VT_COUNT, count, 0);
+  }
   StatBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   StatBuilder &operator=(const StatBuilder &);
   flatbuffers::Offset<Stat> Finish() {
@@ -504,34 +512,90 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct MonsterBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_pos(const Vec3 *pos) { fbb_.AddStruct(Monster::VT_POS, pos); }
-  void add_mana(int16_t mana) { fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150); }
-  void add_hp(int16_t hp) { fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100); }
-  void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(Monster::VT_NAME, name); }
-  void add_inventory(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory) { fbb_.AddOffset(Monster::VT_INVENTORY, inventory); }
-  void add_color(Color color) { fbb_.AddElement<int8_t>(Monster::VT_COLOR, static_cast<int8_t>(color), 8); }
-  void add_test_type(Any test_type) { fbb_.AddElement<uint8_t>(Monster::VT_TEST_TYPE, static_cast<uint8_t>(test_type), 0); }
-  void add_test(flatbuffers::Offset<void> test) { fbb_.AddOffset(Monster::VT_TEST, test); }
-  void add_test4(flatbuffers::Offset<flatbuffers::Vector<const Test *>> test4) { fbb_.AddOffset(Monster::VT_TEST4, test4); }
-  void add_testarrayofstring(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring) { fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING, testarrayofstring); }
-  void add_testarrayoftables(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Monster>>> testarrayoftables) { fbb_.AddOffset(Monster::VT_TESTARRAYOFTABLES, testarrayoftables); }
-  void add_enemy(flatbuffers::Offset<Monster> enemy) { fbb_.AddOffset(Monster::VT_ENEMY, enemy); }
-  void add_testnestedflatbuffer(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testnestedflatbuffer) { fbb_.AddOffset(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer); }
-  void add_testempty(flatbuffers::Offset<Stat> testempty) { fbb_.AddOffset(Monster::VT_TESTEMPTY, testempty); }
-  void add_testbool(bool testbool) { fbb_.AddElement<uint8_t>(Monster::VT_TESTBOOL, static_cast<uint8_t>(testbool), 0); }
-  void add_testhashs32_fnv1(int32_t testhashs32_fnv1) { fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0); }
-  void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) { fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0); }
-  void add_testhashs64_fnv1(int64_t testhashs64_fnv1) { fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0); }
-  void add_testhashu64_fnv1(uint64_t testhashu64_fnv1) { fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0); }
-  void add_testhashs32_fnv1a(int32_t testhashs32_fnv1a) { fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0); }
-  void add_testhashu32_fnv1a(uint32_t testhashu32_fnv1a) { fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0); }
-  void add_testhashs64_fnv1a(int64_t testhashs64_fnv1a) { fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0); }
-  void add_testhashu64_fnv1a(uint64_t testhashu64_fnv1a) { fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0); }
-  void add_testarrayofbools(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testarrayofbools) { fbb_.AddOffset(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools); }
-  void add_testf(float testf) { fbb_.AddElement<float>(Monster::VT_TESTF, testf, 3.14159f); }
-  void add_testf2(float testf2) { fbb_.AddElement<float>(Monster::VT_TESTF2, testf2, 3.0f); }
-  void add_testf3(float testf3) { fbb_.AddElement<float>(Monster::VT_TESTF3, testf3, 0.0f); }
-  void add_testarrayofstring2(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring2) { fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2); }
+  void add_pos(const Vec3 *pos) {
+    fbb_.AddStruct(Monster::VT_POS, pos);
+  }
+  void add_mana(int16_t mana) {
+    fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);
+  }
+  void add_hp(int16_t hp) {
+    fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);
+  }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(Monster::VT_NAME, name);
+  }
+  void add_inventory(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory) {
+    fbb_.AddOffset(Monster::VT_INVENTORY, inventory);
+  }
+  void add_color(Color color) {
+    fbb_.AddElement<int8_t>(Monster::VT_COLOR, static_cast<int8_t>(color), 8);
+  }
+  void add_test_type(Any test_type) {
+    fbb_.AddElement<uint8_t>(Monster::VT_TEST_TYPE, static_cast<uint8_t>(test_type), 0);
+  }
+  void add_test(flatbuffers::Offset<void> test) {
+    fbb_.AddOffset(Monster::VT_TEST, test);
+  }
+  void add_test4(flatbuffers::Offset<flatbuffers::Vector<const Test *>> test4) {
+    fbb_.AddOffset(Monster::VT_TEST4, test4);
+  }
+  void add_testarrayofstring(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring) {
+    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);
+  }
+  void add_testarrayoftables(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Monster>>> testarrayoftables) {
+    fbb_.AddOffset(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);
+  }
+  void add_enemy(flatbuffers::Offset<Monster> enemy) {
+    fbb_.AddOffset(Monster::VT_ENEMY, enemy);
+  }
+  void add_testnestedflatbuffer(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testnestedflatbuffer) {
+    fbb_.AddOffset(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);
+  }
+  void add_testempty(flatbuffers::Offset<Stat> testempty) {
+    fbb_.AddOffset(Monster::VT_TESTEMPTY, testempty);
+  }
+  void add_testbool(bool testbool) {
+    fbb_.AddElement<uint8_t>(Monster::VT_TESTBOOL, static_cast<uint8_t>(testbool), 0);
+  }
+  void add_testhashs32_fnv1(int32_t testhashs32_fnv1) {
+    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);
+  }
+  void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) {
+    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);
+  }
+  void add_testhashs64_fnv1(int64_t testhashs64_fnv1) {
+    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);
+  }
+  void add_testhashu64_fnv1(uint64_t testhashu64_fnv1) {
+    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);
+  }
+  void add_testhashs32_fnv1a(int32_t testhashs32_fnv1a) {
+    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);
+  }
+  void add_testhashu32_fnv1a(uint32_t testhashu32_fnv1a) {
+    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);
+  }
+  void add_testhashs64_fnv1a(int64_t testhashs64_fnv1a) {
+    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);
+  }
+  void add_testhashu64_fnv1a(uint64_t testhashu64_fnv1a) {
+    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);
+  }
+  void add_testarrayofbools(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testarrayofbools) {
+    fbb_.AddOffset(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);
+  }
+  void add_testf(float testf) {
+    fbb_.AddElement<float>(Monster::VT_TESTF, testf, 3.14159f);
+  }
+  void add_testf2(float testf2) {
+    fbb_.AddElement<float>(Monster::VT_TESTF2, testf2, 3.0f);
+  }
+  void add_testf3(float testf3) {
+    fbb_.AddElement<float>(Monster::VT_TESTF3, testf3, 0.0f);
+  }
+  void add_testarrayofstring2(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring2) {
+    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);
+  }
   MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   MonsterBuilder &operator=(const MonsterBuilder &);
   flatbuffers::Offset<Monster> Finish() {
@@ -830,7 +894,9 @@ inline bool VerifyMonsterBuffer(flatbuffers::Verifier &verifier) {
   return verifier.VerifyBuffer<MyGame::Example::Monster>(MonsterIdentifier());
 }
 
-inline const char *MonsterExtension() { return "mon"; }
+inline const char *MonsterExtension() {
+  return "mon";
+}
 
 inline void FinishMonsterBuffer(flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset<MyGame::Example::Monster> root) {
   fbb.Finish(root, MonsterIdentifier());
diff --git a/tests/namespace_test/namespace_test1_generated.h b/tests/namespace_test/namespace_test1_generated.h
index 59d4030a..3e036694 100644
--- a/tests/namespace_test/namespace_test1_generated.h
+++ b/tests/namespace_test/namespace_test1_generated.h
@@ -61,7 +61,9 @@ struct TableInNestedNS FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct TableInNestedNSBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_foo(int32_t foo) { fbb_.AddElement<int32_t>(TableInNestedNS::VT_FOO, foo, 0); }
+  void add_foo(int32_t foo) {
+    fbb_.AddElement<int32_t>(TableInNestedNS::VT_FOO, foo, 0);
+  }
   TableInNestedNSBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   TableInNestedNSBuilder &operator=(const TableInNestedNSBuilder &);
   flatbuffers::Offset<TableInNestedNS> Finish() {
diff --git a/tests/namespace_test/namespace_test2_generated.h b/tests/namespace_test/namespace_test2_generated.h
index 77578bc6..693d9f83 100644
--- a/tests/namespace_test/namespace_test2_generated.h
+++ b/tests/namespace_test/namespace_test2_generated.h
@@ -48,9 +48,15 @@ struct TableInFirstNS FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct TableInFirstNSBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_foo_table(flatbuffers::Offset<NamespaceA::NamespaceB::TableInNestedNS> foo_table) { fbb_.AddOffset(TableInFirstNS::VT_FOO_TABLE, foo_table); }
-  void add_foo_enum(NamespaceA::NamespaceB::EnumInNestedNS foo_enum) { fbb_.AddElement<int8_t>(TableInFirstNS::VT_FOO_ENUM, static_cast<int8_t>(foo_enum), 0); }
-  void add_foo_struct(const NamespaceA::NamespaceB::StructInNestedNS *foo_struct) { fbb_.AddStruct(TableInFirstNS::VT_FOO_STRUCT, foo_struct); }
+  void add_foo_table(flatbuffers::Offset<NamespaceA::NamespaceB::TableInNestedNS> foo_table) {
+    fbb_.AddOffset(TableInFirstNS::VT_FOO_TABLE, foo_table);
+  }
+  void add_foo_enum(NamespaceA::NamespaceB::EnumInNestedNS foo_enum) {
+    fbb_.AddElement<int8_t>(TableInFirstNS::VT_FOO_ENUM, static_cast<int8_t>(foo_enum), 0);
+  }
+  void add_foo_struct(const NamespaceA::NamespaceB::StructInNestedNS *foo_struct) {
+    fbb_.AddStruct(TableInFirstNS::VT_FOO_STRUCT, foo_struct);
+  }
   TableInFirstNSBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   TableInFirstNSBuilder &operator=(const TableInFirstNSBuilder &);
   flatbuffers::Offset<TableInFirstNS> Finish() {
@@ -96,8 +102,12 @@ struct TableInC FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct TableInCBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_refer_to_a1(flatbuffers::Offset<NamespaceA::TableInFirstNS> refer_to_a1) { fbb_.AddOffset(TableInC::VT_REFER_TO_A1, refer_to_a1); }
-  void add_refer_to_a2(flatbuffers::Offset<NamespaceA::SecondTableInA> refer_to_a2) { fbb_.AddOffset(TableInC::VT_REFER_TO_A2, refer_to_a2); }
+  void add_refer_to_a1(flatbuffers::Offset<NamespaceA::TableInFirstNS> refer_to_a1) {
+    fbb_.AddOffset(TableInC::VT_REFER_TO_A1, refer_to_a1);
+  }
+  void add_refer_to_a2(flatbuffers::Offset<NamespaceA::SecondTableInA> refer_to_a2) {
+    fbb_.AddOffset(TableInC::VT_REFER_TO_A2, refer_to_a2);
+  }
   TableInCBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   TableInCBuilder &operator=(const TableInCBuilder &);
   flatbuffers::Offset<TableInC> Finish() {
@@ -136,7 +146,9 @@ struct SecondTableInA FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
 struct SecondTableInABuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_refer_to_c(flatbuffers::Offset<NamespaceC::TableInC> refer_to_c) { fbb_.AddOffset(SecondTableInA::VT_REFER_TO_C, refer_to_c); }
+  void add_refer_to_c(flatbuffers::Offset<NamespaceC::TableInC> refer_to_c) {
+    fbb_.AddOffset(SecondTableInA::VT_REFER_TO_C, refer_to_c);
+  }
   SecondTableInABuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
   SecondTableInABuilder &operator=(const SecondTableInABuilder &);
   flatbuffers::Offset<SecondTableInA> Finish() {
-- 
GitLab