forked from BigfootDev/flatbuffers
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
138 lines
4.3 KiB
C++
138 lines
4.3 KiB
C++
/*
|
|
* Copyright 2014 Google Inc. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef FLATBUFFERS_CODE_GENERATORS_H_
|
|
#define FLATBUFFERS_CODE_GENERATORS_H_
|
|
|
|
#include <map>
|
|
#include <sstream>
|
|
#include "flatbuffers/idl.h"
|
|
|
|
namespace flatbuffers {
|
|
|
|
// Utility class to assist in generating code through use of text templates.
|
|
//
|
|
// Example code:
|
|
// CodeWriter code;
|
|
// code.SetValue("NAME", "Foo");
|
|
// code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }";
|
|
// code.SetValue("NAME", "Bar");
|
|
// code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }";
|
|
// std::cout << code.ToString() << std::endl;
|
|
//
|
|
// Output:
|
|
// void Foo() { printf("%s", "Foo"); }
|
|
// void Bar() { printf("%s", "Bar"); }
|
|
class CodeWriter {
|
|
public:
|
|
CodeWriter() {}
|
|
|
|
// Clears the current "written" code.
|
|
void Clear() {
|
|
stream_.str("");
|
|
stream_.clear();
|
|
}
|
|
|
|
// Associates a key with a value. All subsequent calls to operator+=, where
|
|
// the specified key is contained in {{ and }} delimiters will be replaced by
|
|
// the given value.
|
|
void SetValue(const std::string& key, const std::string& value) {
|
|
value_map_[key] = value;
|
|
}
|
|
|
|
// Appends the given text to the generated code as well as a newline
|
|
// character. Any text within {{ and }} delimeters is replaced by values
|
|
// previously stored in the CodeWriter by calling SetValue above. The newline
|
|
// will be suppressed if the text ends with the \\ character.
|
|
void operator+=(std::string text);
|
|
|
|
// Returns the current contents of the CodeWriter as a std::string.
|
|
std::string ToString() const { return stream_.str(); }
|
|
|
|
private:
|
|
std::map<std::string, std::string> value_map_;
|
|
std::stringstream stream_;
|
|
};
|
|
|
|
class BaseGenerator {
|
|
public:
|
|
virtual bool generate() = 0;
|
|
|
|
static std::string NamespaceDir(const Parser &parser,
|
|
const std::string &path,
|
|
const Namespace &ns);
|
|
|
|
protected:
|
|
BaseGenerator(const Parser &parser, const std::string &path,
|
|
const std::string &file_name,
|
|
const std::string qualifying_start,
|
|
const std::string qualifying_separator)
|
|
: parser_(parser),
|
|
path_(path),
|
|
file_name_(file_name),
|
|
qualifying_start_(qualifying_start),
|
|
qualifying_separator_(qualifying_separator) {}
|
|
virtual ~BaseGenerator() {}
|
|
|
|
// No copy/assign.
|
|
BaseGenerator &operator=(const BaseGenerator &);
|
|
BaseGenerator(const BaseGenerator &);
|
|
|
|
std::string NamespaceDir(const Namespace &ns) const;
|
|
|
|
static const char *FlatBuffersGeneratedWarning();
|
|
|
|
bool IsEverythingGenerated() const;
|
|
|
|
static std::string FullNamespace(const char *separator, const Namespace &ns);
|
|
|
|
static std::string LastNamespacePart(const Namespace &ns);
|
|
|
|
// tracks the current namespace for early exit in WrapInNameSpace
|
|
// 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() 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) const;
|
|
|
|
std::string WrapInNameSpace(const Definition &def) const;
|
|
|
|
const Parser &parser_;
|
|
const std::string &path_;
|
|
const std::string &file_name_;
|
|
const std::string qualifying_start_;
|
|
const std::string qualifying_separator_;
|
|
};
|
|
|
|
struct CommentConfig {
|
|
const char *first_line;
|
|
const char *content_line_prefix;
|
|
const char *last_line;
|
|
};
|
|
|
|
extern void GenComment(const std::vector<std::string> &dc,
|
|
std::string *code_ptr,
|
|
const CommentConfig *config,
|
|
const char *prefix = "");
|
|
|
|
} // namespace flatbuffers
|
|
|
|
#endif // FLATBUFFERS_CODE_GENERATORS_H_
|