• Wouter van Oortmerssen's avatar
    Add CodeWriter utility class. · 7b94eab2
    Wouter van Oortmerssen authored
    Helps simplify code generation code.  Instead of this:
      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";
    
    You do this:
      code.SetValue("NAME", struct_def.name);
      code.SetValue("CPP_NAME", cpp_qualified_name);
      code += "inline const {{CPP_NAME}} *Get{{NAME}}(const void *buf) {";
      code += "  return flatbuffers::GetRoot<{{CPP_NAME}}>(buf);";
      code += "}";
      code += "";
    
    Updated the CPP code generator to use the CodeWriter class.  Most of the
    changes in the generated code are white-space changes, esp. around new
    lines (since the code generator class automatically appends new lines
    when appending a string).  Actual code changes include:
    
    * Renamed "rehasher" to "_rehasher" for consistency with other args in
      Pack function.
    
    * Renamed "union_obj" to "obj: in UnPack function.
    
    * Always do "(void)_o;" to prevent unused variable warning in Create
      function (instead of only doing it if there are no fields) in order
      to avoid two-passes.
    
    * Renamed padding variables from __paddingX to paddingX__.
      "Each name that contains a double underscore (_ _) [...] is reserved
       to the implementation for any use."  C++ standards 17.4.3.1.2.
    
    * Add braces around switch cases.
    
    * Calculate index as a separate statement in EnumName function, eg.
        const size_t index = ...;
        return EnumNamesX()[index];
      vs.
        return EnumNamesX()[...];
    
    * Stored end table offset in variable in Finish() functions, eg.
        const auto end = fbb_.EndTable(start_, ...);
        auto o = flatbuffers::Offset<T>(end);
      vs.
        auto o = flatbuffers::Offset<T>(fbb_.EndTable(start, ...));
    
    * Separate reinterpret_cast calls from function calls in Union
      functions, eg.
        auto ptr = reinterpret_cast<const T *>(obj);
        return ptr->UnPack(resolver);
      vs.
        return reinterpret_cast<const T *>(obj)->UnPack(resolver);
    
    * Removed unecessary (void)(padding__X) no-ops from constructors, eg.
        Test(int16_t a, int8_t b) : ... {
          (void)__padding0;  // <-- Removed this line.
        }
    
    In the idl_gen_cpp.cpp file itself, I refactored some code generation into
    new functions: GenParam, GenNativeTable, GenVerifyCall, GenBuilders,
    GenUnpackFieldStatement, and GenCreateParam.
    
    Change-Id: I727b1bd8719d05b7ce33cbce00eb58fda817b25d
    7b94eab2
namespace_test2_generated.h 7.22 KB