class Function
{
public:
struct param_t
{
param_t(std::string type, std::string name)
: m_value(std::move(type) + " " + std::move(name))
{
}
operator std::string() const { return m_value; } // NOLINT
const auto& value() const { return m_value; }
private:
std::string m_value;
};
explicit Function(std::string name)
: m_name(std::move(name))
{
}
Function(std::string name,
std::string ret,
const std::vector<param_t>& params)
: m_name(std::move(name))
, m_ret(std::move(ret))
, m_params(params.begin(), params.end())
{
}
std::string open(const std::string& name,
const std::string& ret,
const std::vector<std::string>& params = {});
Function(std::string name,
std::string ret,
std::vector<std::string> params = {})
: m_name(std::move(name))
, m_ret(std::move(ret))
, m_params(std::move(params))
std::string open(const std::string& name,
const std::string& ret,
const std::vector<param_t>& params)
{
return open(name,
ret,
std::vector<std::string>(std::begin(params), std::end(params)));
}
const auto& name() const { return m_name; }
const auto& ret() const { return m_ret; }
const auto& params() const { return m_params; }
operator std::string() const; // NOLINT
std::string close(const std::string& name);
private:
std::string m_name;
std::string m_ret;
std::vector<std::string> m_params;
std::string m_last;
};
class FunctionD : public Function
class Namespace
{
public:
FunctionD(std::string name,
std::string ret,
const std::vector<param_t>& params)
: Function(std::move(name), std::move(ret), params)
{
}
std::string open(const std::string& name);
std::string close(const std::string& name);
FunctionD(std::string name,
std::string ret,
std::vector<std::string> params = {})
: Function(std::move(name), std::move(ret), std::move(params))
{
}
operator std::string() const; // NOLINT
private:
std::unordered_set<std::string> m_seen;
std::stack<std::string> m_stk;
};
} // namespace cemplate