24 assert(m_Parent !=
this);
27 Substitutions(
const std::vector<FunctionTemplate> &functions,
const std::string &ftype) : m_Parent(nullptr)
30 for(
const auto &f: functions) {
31 const std::string &funcTemplate = (ftype ==
"double") ? f.doublePrecisionTemplate : f.singlePrecisionTemplate;
39 void addVarSubstitution(
const std::string &source,
const std::string &destionation,
bool allowOverride =
false)
41 auto res = m_VarSubstitutions.emplace(source, destionation);
42 if(!allowOverride && !res.second) {
43 throw std::runtime_error(
"'" + source +
"' already has a variable substitution");
47 void addFuncSubstitution(
const std::string &source,
unsigned int numArguments,
const std::string &funcTemplate,
bool allowOverride =
false)
49 auto res = m_FuncSubstitutions.emplace(std::piecewise_construct,
50 std::forward_as_tuple(source),
51 std::forward_as_tuple(numArguments, funcTemplate));
52 if(!allowOverride && !res.second) {
53 throw std::runtime_error(
"'" + source +
"' already has a function substitution");
59 return (m_VarSubstitutions.find(source) != m_VarSubstitutions.end());
64 auto var = m_VarSubstitutions.find(source);
65 if(var != m_VarSubstitutions.end()) {
72 throw std::runtime_error(
"Nothing to substitute for '" + source +
"'");
76 void apply(std::string &code)
const 87 const std::string
operator[] (
const std::string &source)
const 96 void applyFuncs(std::string &code)
const 99 for(
const auto &f : m_FuncSubstitutions) {
105 m_Parent->applyFuncs(code);
109 void applyVars(std::string &code)
const 112 for(
const auto &v : m_VarSubstitutions) {
113 substitute(code,
"$(" + v.first +
")", v.second);
118 m_Parent->applyVars(code);
125 std::map<std::string, std::string> m_VarSubstitutions;
126 std::map<std::string, std::pair<unsigned int, std::string>> m_FuncSubstitutions;
Substitutions(const Substitutions *parent=nullptr)
Definition: substitutions.h:22
const std::string & getVarSubstitution(const std::string &source) const
Definition: substitutions.h:62
Helper class for generating code - automatically inserts brackets, indents etc.
Definition: backendBase.h:22
Substitutions(const std::vector< FunctionTemplate > &functions, const std::string &ftype)
Definition: substitutions.h:27
Definition: substitutions.h:19
void functionSubstitute(std::string &code, const std::string &funcName, unsigned int numParams, const std::string &replaceFuncTemplate)
This function substitutes function calls in the form:
Definition: codeGenUtils.cc:287
void addVarSubstitution(const std::string &source, const std::string &destionation, bool allowOverride=false)
Definition: substitutions.h:39
void apply(std::string &code) const
Definition: substitutions.h:76
void addFuncSubstitution(const std::string &source, unsigned int numArguments, const std::string &funcTemplate, bool allowOverride=false)
Definition: substitutions.h:47
bool hasVarSubstitution(const std::string &source) const
Definition: substitutions.h:57
const std::string operator[](const std::string &source) const
Definition: substitutions.h:87
void substitute(std::string &s, const std::string &trg, const std::string &rep)
Tool for substituting strings in the neuron code strings or other templates.
Definition: codeGenUtils.cc:233