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::Float:
192 return "nvneural::TensorDataType::Float";
193 case TensorDataType::Half:
194 return "nvneural::TensorDataType::Half";
195 case TensorDataType::CompressedPng:
196 return "nvneural::TensorDataType::CompressedPng";
201 return "unrecognizable type";
204 std::string generateTypeString(TensorDataLayout layout)
208 case TensorDataLayout::TestOnly:
209 return "nvneural::TensorDataLayout::TestOnly";
210 case TensorDataLayout::Nchw:
211 return "nvneural::TensorDataLayout::Nchw";
212 case TensorDataLayout::Nhwc:
213 return "nvneural::TensorDataLayout::Nhwc";
219 return "unrecognizable layout";
222 std::string generateTypeString(NetworkBackendId backend)
226 case NetworkBackendId::TestOnly:
227 return "nvneural::NetworkBackendId::TestOnly";
228 case NetworkBackendId::Cpu:
229 return "nvneural::NetworkBackendId::Cpu";
230 case NetworkBackendId::Cuda:
231 return "nvneural::NetworkBackendId::Cuda";
237 return "unrecognizable backend";
240 std::string floatToStr(
float n)
242 std::string s = std::to_string(n);
243 if (s.find(
'.') == std::string::npos)
253 if(val<10)
return '0'+val;
257 std::string toCppString(std::string str)
260 for(
size_t i=0;i<str.size();i++)
262 if(i+1 < str.size() && ((str[i]==
'\n' && str[i+1]==
'\r') || (str[i]==
'\r' && str[i+1]==
'\n')))
267 else if(str[i]==
'\r' || str[i]==
'\n')
271 else if(str[i]==
'\"')
275 else if(str[i]==
'\\')
279 else if(str[i]<0x20 && str[i]!=
'\t')
282 rv.push_back(toHex((str[i]>>4)&0xf));
283 rv.push_back(toHex(str[i]&0xf));
287 rv.push_back(str[i]);
292 std::vector<std::string> toCppStringLines(std::string str)
294 std::vector<std::string> lines;
297 for(
size_t i=0;i<str.size();i++)
299 if(i+1 < str.size() && ((str[i]==
'\n' && str[i+1]==
'\r') || (str[i]==
'\r' && str[i+1]==
'\n')))
303 temp.push_back(str[i]);
304 if(str[i]==
'\r' || str[i]==
'\n')
306 lines.push_back(toCppString(temp));
311 lines.push_back(toCppString(temp));
Definitions of C++ code generation interfaces exported by tools and plugins.