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 inline 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 inline 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 inline 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 inline std::string floatToStr(
float n)
246 std::string s = std::to_string(n);
247 if (s.find(
'.') == std::string::npos)
255 inline char toHex(
int val)
257 if(val<10)
return '0'+val;
261 inline 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]);
297 inline std::vector<std::string> toCppStringLines(std::string str)
299 std::vector<std::string> lines;
302 for(
size_t i=0;i<str.size();i++)
304 if(i+1 < str.size() && ((str[i]==
'\n' && str[i+1]==
'\r') || (str[i]==
'\r' && str[i+1]==
'\n')))
308 temp.push_back(str[i]);
309 if(str[i]==
'\r' || str[i]==
'\n')
311 lines.push_back(toCppString(temp));
316 lines.push_back(toCppString(temp));
Definitions of C++ code generation interfaces exported by tools and plugins.