return join(std::begin(list), std::end(list), delim, func);
}
class Program
struct param_t
{
param_t(const std::string& type, const std::string& name)
: m_value(type + " " + name)
{
}
operator std::string() const { return m_value; } // NOLINT
const auto& value() const { return m_value; }
private:
std::string m_value;
};
class InitlistElem;
class InitlistNode
{
public:
using s_t = const std::string&;
using l_t = const std::vector<std::string>&;
InitlistNode(std::initializer_list<InitlistElem> list);
explicit Program(std::ostream& ost)
: m_ost(ost)
template<typename InputItr, typename UnaryFunc>
InitlistNode(InputItr first, InputItr last, UnaryFunc func);
std::string format(uint64_t lvl) const;
operator std::string() const; // NOLINT
private:
std::vector<InitlistElem> m_values; // NOLINT
};
class InitlistElem
{
public:
InitlistElem(std::string value) // NOLINT
: m_value(std::move(value))
{
}
struct param_t
InitlistElem(std::string_view value) // NOLINT
: m_value(std::in_place_type<std::string>, value)
{
param_t(s_t type, s_t name)
: m_value(type + " " + name)
{
}
operator std::string() const { return m_value; } // NOLINT
const auto& value() const { return m_value; }
}
private:
std::string m_value;
};
InitlistElem(const char* value) // NOLINT
: m_value(value)
{
}
class InitlistElem;
InitlistElem(std::initializer_list<InitlistElem> list) // NOLINT
: m_value(std::in_place_type<InitlistNode>, list)
{
}
class InitlistNode
InitlistElem(InitlistNode list) // NOLINT
: m_value(std::move(list))
{
public:
InitlistNode(std::initializer_list<InitlistElem> list);
}
template<typename InputItr, typename UnaryFunc>
InitlistNode(InputItr first, InputItr last, UnaryFunc func);
const auto& value() const { return m_value; }
std::string format(uint64_t lvl) const;
private:
std::variant<std::string, InitlistNode> m_value;
};
operator std::string() const; // NOLINT
static auto indent(std::size_t lvl)
{
return std::string(lvl * 2, ' ');
}
private:
std::vector<InitlistElem> m_values; // NOLINT
};
std::string string(const std::string& value);
class InitlistElem
class Program
{
public:
explicit Program(std::ostream& ost)
: m_ost(ost)
{
public:
InitlistElem(std::string value) // NOLINT
: m_value(std::move(value))
{
}
InitlistElem(std::string_view value) // NOLINT
: m_value(std::in_place_type<std::string>, value)
{
}
InitlistElem(const char* value) // NOLINT
: m_value(value)
{
}
InitlistElem(std::initializer_list<InitlistElem> list) // NOLINT
: m_value(std::in_place_type<InitlistNode>, list)
{
}
InitlistElem(InitlistNode list) // NOLINT
: m_value(std::move(list))
{
}
const auto& value() const { return m_value; }
private:
std::variant<std::string, InitlistNode> m_value;
};
}
using s_t = const std::string&;
using l_t = const std::vector<std::string>&;
using p_t = const std::vector<param_t>&;
using i_t = const InitlistNode&;
// NOLINTBEGIN
Program& line_empty();