github.com/google/syzkaller@v0.0.0-20240517125934-c0f1611a36d6/executor/_include/flatbuffers/code_generators.h (about)

     1  /*
     2   * Copyright 2014 Google Inc. All rights reserved.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  #ifndef FLATBUFFERS_CODE_GENERATORS_H_
    18  #define FLATBUFFERS_CODE_GENERATORS_H_
    19  
    20  #include <map>
    21  #include <sstream>
    22  
    23  #include "flatbuffers/idl.h"
    24  
    25  namespace flatbuffers {
    26  
    27  // Utility class to assist in generating code through use of text templates.
    28  //
    29  // Example code:
    30  //   CodeWriter code("\t");
    31  //   code.SetValue("NAME", "Foo");
    32  //   code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }";
    33  //   code.SetValue("NAME", "Bar");
    34  //   code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }";
    35  //   std::cout << code.ToString() << std::endl;
    36  //
    37  // Output:
    38  //  void Foo() { printf("%s", "Foo"); }
    39  //  void Bar() { printf("%s", "Bar"); }
    40  class CodeWriter {
    41   public:
    42    CodeWriter(std::string pad = std::string())
    43        : pad_(pad), cur_ident_lvl_(0), ignore_ident_(false) {}
    44  
    45    // Clears the current "written" code.
    46    void Clear() {
    47      stream_.str("");
    48      stream_.clear();
    49    }
    50  
    51    // Associates a key with a value.  All subsequent calls to operator+=, where
    52    // the specified key is contained in {{ and }} delimiters will be replaced by
    53    // the given value.
    54    void SetValue(const std::string &key, const std::string &value) {
    55      value_map_[key] = value;
    56    }
    57  
    58    std::string GetValue(const std::string &key) const {
    59      const auto it = value_map_.find(key);
    60      return it == value_map_.end() ? "" : it->second;
    61    }
    62  
    63    // Appends the given text to the generated code as well as a newline
    64    // character.  Any text within {{ and }} delimiters is replaced by values
    65    // previously stored in the CodeWriter by calling SetValue above.  The newline
    66    // will be suppressed if the text ends with the \\ character.
    67    void operator+=(std::string text);
    68  
    69    // Returns the current contents of the CodeWriter as a std::string.
    70    std::string ToString() const { return stream_.str(); }
    71  
    72    // Increase ident level for writing code
    73    void IncrementIdentLevel() { cur_ident_lvl_++; }
    74    // Decrease ident level for writing code
    75    void DecrementIdentLevel() {
    76      if (cur_ident_lvl_) cur_ident_lvl_--;
    77    }
    78  
    79    void SetPadding(const std::string &padding) { pad_ = padding; }
    80  
    81   private:
    82    std::map<std::string, std::string> value_map_;
    83    std::stringstream stream_;
    84    std::string pad_;
    85    int cur_ident_lvl_;
    86    bool ignore_ident_;
    87  
    88    // Add ident padding (tab or space) based on ident level
    89    void AppendIdent(std::stringstream &stream);
    90  };
    91  
    92  class BaseGenerator {
    93   public:
    94    virtual bool generate() = 0;
    95  
    96    static std::string NamespaceDir(const Parser &parser, const std::string &path,
    97                                    const Namespace &ns,
    98                                    const bool dasherize = false);
    99  
   100    std::string GeneratedFileName(const std::string &path,
   101                                  const std::string &file_name,
   102                                  const IDLOptions &options) const;
   103  
   104   protected:
   105    BaseGenerator(const Parser &parser, const std::string &path,
   106                  const std::string &file_name, std::string qualifying_start,
   107                  std::string qualifying_separator, std::string default_extension)
   108        : parser_(parser),
   109          path_(path),
   110          file_name_(file_name),
   111          qualifying_start_(qualifying_start),
   112          qualifying_separator_(qualifying_separator),
   113          default_extension_(default_extension) {}
   114    virtual ~BaseGenerator() {}
   115  
   116    // No copy/assign.
   117    BaseGenerator &operator=(const BaseGenerator &);
   118    BaseGenerator(const BaseGenerator &);
   119  
   120    std::string NamespaceDir(const Namespace &ns,
   121                             const bool dasherize = false) const;
   122  
   123    static const char *FlatBuffersGeneratedWarning();
   124  
   125    static std::string FullNamespace(const char *separator, const Namespace &ns);
   126  
   127    static std::string LastNamespacePart(const Namespace &ns);
   128  
   129    // tracks the current namespace for early exit in WrapInNameSpace
   130    // c++, java and csharp returns a different namespace from
   131    // the following default (no early exit, always fully qualify),
   132    // which works for js and php
   133    virtual const Namespace *CurrentNameSpace() const { return nullptr; }
   134  
   135    // Ensure that a type is prefixed with its namespace even within
   136    // its own namespace to avoid conflict between generated method
   137    // names and similarly named classes or structs
   138    std::string WrapInNameSpace(const Namespace *ns,
   139                                const std::string &name) const;
   140  
   141    std::string WrapInNameSpace(const Definition &def,
   142                                const std::string &suffix = "") const;
   143  
   144    std::string GetNameSpace(const Definition &def) const;
   145  
   146    const Parser &parser_;
   147    const std::string &path_;
   148    const std::string &file_name_;
   149    const std::string qualifying_start_;
   150    const std::string qualifying_separator_;
   151    const std::string default_extension_;
   152  };
   153  
   154  struct CommentConfig {
   155    const char *first_line;
   156    const char *content_line_prefix;
   157    const char *last_line;
   158  };
   159  
   160  extern void GenComment(const std::vector<std::string> &dc,
   161                         std::string *code_ptr, const CommentConfig *config,
   162                         const char *prefix = "");
   163  
   164  class FloatConstantGenerator {
   165   public:
   166    virtual ~FloatConstantGenerator() {}
   167    std::string GenFloatConstant(const FieldDef &field) const;
   168  
   169   private:
   170    virtual std::string Value(double v, const std::string &src) const = 0;
   171    virtual std::string Inf(double v) const = 0;
   172    virtual std::string NaN(double v) const = 0;
   173  
   174    virtual std::string Value(float v, const std::string &src) const = 0;
   175    virtual std::string Inf(float v) const = 0;
   176    virtual std::string NaN(float v) const = 0;
   177  
   178    template<typename T>
   179    std::string GenFloatConstantImpl(const FieldDef &field) const;
   180  };
   181  
   182  class SimpleFloatConstantGenerator : public FloatConstantGenerator {
   183   public:
   184    SimpleFloatConstantGenerator(const char *nan_number,
   185                                 const char *pos_inf_number,
   186                                 const char *neg_inf_number);
   187  
   188   private:
   189    std::string Value(double v,
   190                      const std::string &src) const FLATBUFFERS_OVERRIDE;
   191    std::string Inf(double v) const FLATBUFFERS_OVERRIDE;
   192    std::string NaN(double v) const FLATBUFFERS_OVERRIDE;
   193  
   194    std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE;
   195    std::string Inf(float v) const FLATBUFFERS_OVERRIDE;
   196    std::string NaN(float v) const FLATBUFFERS_OVERRIDE;
   197  
   198    const std::string nan_number_;
   199    const std::string pos_inf_number_;
   200    const std::string neg_inf_number_;
   201  };
   202  
   203  // C++, C#, Java like generator.
   204  class TypedFloatConstantGenerator : public FloatConstantGenerator {
   205   public:
   206    TypedFloatConstantGenerator(const char *double_prefix,
   207                                const char *single_prefix, const char *nan_number,
   208                                const char *pos_inf_number,
   209                                const char *neg_inf_number = "");
   210  
   211   private:
   212    std::string Value(double v,
   213                      const std::string &src) const FLATBUFFERS_OVERRIDE;
   214    std::string Inf(double v) const FLATBUFFERS_OVERRIDE;
   215  
   216    std::string NaN(double v) const FLATBUFFERS_OVERRIDE;
   217  
   218    std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE;
   219    std::string Inf(float v) const FLATBUFFERS_OVERRIDE;
   220    std::string NaN(float v) const FLATBUFFERS_OVERRIDE;
   221  
   222    std::string MakeNaN(const std::string &prefix) const;
   223    std::string MakeInf(bool neg, const std::string &prefix) const;
   224  
   225    const std::string double_prefix_;
   226    const std::string single_prefix_;
   227    const std::string nan_number_;
   228    const std::string pos_inf_number_;
   229    const std::string neg_inf_number_;
   230  };
   231  
   232  }  // namespace flatbuffers
   233  
   234  #endif  // FLATBUFFERS_CODE_GENERATORS_H_