std::variant<std::string, initlist> m_value;
};
class func
{
public:
class param_t
{
public:
param_t(std::string type, std::string name)
: m_value(std::move(type) + " " + std::move(name))
{
}
explicit operator std::string() const { return m_value; }
const auto& value() const { return m_value; }
private:
std::string m_value;
};
explicit func(std::string name)
: m_name(std::move(name))
{
}
func(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())
{
}
func(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))
{
}
const auto& name() const { return m_name; }
const auto& ret() const { return m_ret; }
const auto& params() const { return m_params; }
friend std::ostream& operator<<(std::ostream& ost, const func& rhs);
private:
std::string m_name;
std::string m_ret;
std::vector<std::string> m_params;
};
class func_decl : public func
{
public:
func_decl(std::string name,
std::string ret,
const std::vector<param_t>& params)
: func(std::move(name), std::move(ret), params)
{
}
func_decl(std::string name,
std::string ret,
std::vector<std::string> params = {})
: func(std::move(name), std::move(ret), std::move(params))
{
}
friend std::ostream& operator<<(std::ostream& ost, const func_decl& rhs);
};
class call
{
public:
call(std::string func, std::string args)
: m_func(std::move(func))
, m_args(std::move(args))
{
}
operator std::string() const; // NOLINT
friend std::ostream& operator<<(std::ostream& ost, const call& rhs);
protected:
const auto& func() const { return m_func; }
const auto& args() const { return m_args; }
private:
std::string m_func;
std::string m_args;
};
class call_s : public call
{
public:
call_s(std::string func, std::string args)
: call(std::move(func), std::move(args))
{
}
operator std::string() const; // NOLINT
friend std::ostream& operator<<(std::ostream& ost, const call_s& rhs);
};
class tmplate
{
public:
explicit tmplate(std::vector<std::string> params)
: m_params(std::move(params))
{
}
operator std::string() const; // NOLINT
friend std::ostream& operator<<(std::ostream& ost, const tmplate& rhs);
private:
std::vector<std::string> m_params;
};
class tmplate_spec
{
public:
explicit tmplate_spec(std::string var, std::string param)
: m_var(std::move(var))
, m_param(std::move(param))
{
}
operator std::string() const; // NOLINT
friend std::ostream& operator<<(std::ostream& ost, const tmplate_spec& rhs);
private:
std::string m_var;
std::string m_param;
};
class rquires
{
public:
explicit rquires(std::string value)
: m_value(std::move(value))
{
}
operator std::string() const; // NOLINT
friend std::ostream& operator<<(std::ostream& ost, const rquires& rhs);
private:
std::string m_value;
};
std::string pragma_once();
std::string include(const std::string& header, bool local = false);