25 #ifndef NVNEURAL_CODEGENHELPERS_H 
   26 #define NVNEURAL_CODEGENHELPERS_H 
   33 namespace nvneural { 
namespace {
 
   48     SourceWriter() = 
default;
 
   49     ~SourceWriter() = 
default;
 
   51     std::string str()
 const 
   56     void pushIndent(
const std::string& indent)
 
   58         m_indents.push_back(indent);
 
   66     void writeFragment(
const std::string& fragment)
 
   68         std::string indentPrefix;
 
   69         for (
const std::string& indent : m_indents)
 
   71             indentPrefix += indent;
 
   73         indentFragment(indentPrefix, fragment);
 
   78         friend class SourceWriter;
 
   82             m_owner.writeFragment(m_stream.str());
 
   85         template<
typename TObject>
 
   86         Line& operator<<(TObject obj)
 
   92         explicit Line(SourceWriter& owner)
 
   96         Line(
const Line& copyFrom)
 
   97             : m_owner(copyFrom.m_owner)
 
  107         SourceWriter& m_owner;
 
  108         std::ostringstream m_stream;
 
  118         friend class SourceWriter;
 
  125         explicit ScopedIndent(SourceWriter& owner)
 
  128             m_owner.pushIndent(
"    ");
 
  130         SourceWriter& m_owner;
 
  133     ScopedIndent indent()
 
  135         return ScopedIndent(*
this);
 
  138     class ScopedBraceBlock
 
  140         friend class SourceWriter;
 
  145             m_owner.writeFragment(
"}" + m_suffix);
 
  148         ScopedBraceBlock(SourceWriter& owner, 
const std::string& suffix)
 
  152             m_owner.writeFragment(
"{");
 
  153             m_owner.pushIndent(
"    ");
 
  155         SourceWriter& m_owner;
 
  156         std::string m_suffix;
 
  159     ScopedBraceBlock brace(
const std::string& suffix = 
"")
 
  161         return ScopedBraceBlock(*
this, suffix);
 
  165     std::string m_output;
 
  166     std::vector<std::string> m_indents;
 
  168     void indentFragment(
const std::string& indent, 
const std::string& fragment)
 
  170         std::string::size_type lineBegin = 0;
 
  171         std::string::size_type lineEnd;
 
  174             lineEnd = fragment.find(
'\n', lineBegin);
 
  175             const std::string line = fragment.substr(lineBegin, lineEnd - lineBegin);
 
  182             lineBegin = lineEnd + 1;
 
  183         } 
while (lineEnd != std::string::npos);
 
  187 std::string generateTypeString(TensorDataType data)
 
  191     case TensorDataType::TestOnly:
 
  192         return "nvneural::TensorDataType::TestOnly";
 
  193     case TensorDataType::Float:
 
  194         return "nvneural::TensorDataType::Float";
 
  195     case TensorDataType::Half:
 
  196         return "nvneural::TensorDataType::Half";
 
  197     case TensorDataType::CompressedPng:
 
  198         return "nvneural::TensorDataType::CompressedPng";
 
  199     case TensorDataType::UncompressedRgb:
 
  200         return "nvneural::TensorDataType::UncompressedRgb";
 
  205     return "unrecognizable type";
 
  208 std::string generateTypeString(TensorDataLayout layout)
 
  212     case TensorDataLayout::TestOnly:
 
  213         return "nvneural::TensorDataLayout::TestOnly";
 
  214     case TensorDataLayout::Nchw:
 
  215         return "nvneural::TensorDataLayout::Nchw";
 
  216     case TensorDataLayout::Nhwc:
 
  217         return "nvneural::TensorDataLayout::Nhwc";
 
  223     return "unrecognizable layout";
 
  226 std::string generateTypeString(NetworkBackendId backend)
 
  230     case NetworkBackendId::TestOnly:
 
  231         return "nvneural::NetworkBackendId::TestOnly";
 
  232     case NetworkBackendId::Cpu:
 
  233         return "nvneural::NetworkBackendId::Cpu";
 
  234     case NetworkBackendId::Cuda:
 
  235         return "nvneural::NetworkBackendId::Cuda";
 
  241     return "unrecognizable backend";
 
  244 std::string floatToStr(
float n)
 
  246     std::string s = std::to_string(n);
 
  247     if (s.find(
'.') == std::string::npos) 
 
  257     if(val<10) 
return '0'+val;
 
  261 std::string toCppString(std::string str)
 
  264     for(
size_t i=0;i<str.size();i++)
 
  266         if(i+1 < str.size() && ((str[i]==
'\n' && str[i+1]==
'\r') || (str[i]==
'\r' && str[i+1]==
'\n')))
 
  271         else if(str[i]==
'\r' || str[i]==
'\n')
 
  275         else if(str[i]==
'\"')
 
  279         else if(str[i]==
'\\')
 
  283         else if(str[i]<0x20 && str[i]!=
'\t')
 
  286             rv.push_back(toHex((str[i]>>4)&0xf));
 
  287             rv.push_back(toHex(str[i]&0xf));
 
  291             rv.push_back(str[i]);
 
  296 std::vector<std::string> toCppStringLines(std::string str)
 
  298     std::vector<std::string> lines;
 
  301     for(
size_t i=0;i<str.size();i++)
 
  303         if(i+1 < str.size() && ((str[i]==
'\n' && str[i+1]==
'\r') || (str[i]==
'\r' && str[i+1]==
'\n')))
 
  307         temp.push_back(str[i]);
 
  308         if(str[i]==
'\r' || str[i]==
'\n')
 
  310             lines.push_back(toCppString(temp));
 
  315     lines.push_back(toCppString(temp));
 
Definitions of C++ code generation interfaces exported by tools and plugins.