/* * 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_ namespace flatbuffers { class BaseGenerator { public: virtual bool generate() = 0; static const 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. auto &namespaces = ns.components; for (auto it = namespaces.begin(); it != namespaces.end(); ++it) { namespace_dir += *it + kPathSeparator; EnsureDirExists(namespace_dir.c_str()); } return namespace_dir; } 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 &); const std::string NamespaceDir(const Namespace &ns) { return BaseGenerator::NamespaceDir(parser_, path_, ns); } const char *FlatBuffersGeneratedWarning() { return "automatically generated by the FlatBuffers compiler," " do not modify\n\n"; } bool IsEverythingGenerated() { for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end(); ++it) { if (!(*it)->generated) return false; } for (auto it = parser_.structs_.vec.begin(); it != parser_.structs_.vec.end(); ++it) { if (!(*it)->generated) return false; } return true; } 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) { if (namespace_name.length()) namespace_name += separator; namespace_name += *it; } return namespace_name; } const std::string LastNamespacePart(const Namespace &ns) { auto &namespaces = ns.components; if (namespaces.size()) return *(namespaces.end() - 1); else return std::string(""); } // 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() { 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) { if (CurrentNameSpace() == ns) return name; std::string qualified_name = qualifying_start_; for (auto it = ns->components.begin(); it != ns->components.end(); ++it) qualified_name += *it + qualifying_separator_; return qualified_name + name; } std::string WrapInNameSpace(const Definition &def) { return WrapInNameSpace(def.defined_namespace, def.name); } const Parser &parser_; const std::string &path_; const std::string &file_name_; const std::string qualifying_start_; const std::string qualifying_separator_; }; } // namespace flatbuffers #endif // FLATBUFFERS_CODE_GENERATORS_H_