#ifndef REXY_STRING_APPENDER_HPP #define REXY_STRING_APPENDER_HPP #include "../expression.hpp" #include "../traits.hpp" #include //forward namespace rexy::detail{ template struct string_appender { private: Targ& m_targ; public: constexpr string_appender(Targ& t)noexcept: m_targ(t){} template constexpr void operator()(const binary_expression& expr) noexcept(noexcept((*this)(expr.left())) && noexcept((*this)(expr.right()))) { (*this)(expr.left()); (*this)(expr.right()); } template constexpr void operator()(const unary_expression& expr) noexcept(noexcept((*this)(expr.left()))) { (*this)(expr.left()); } template::value,int> = 0, class = decltype(std::declval().length())> constexpr void operator()(Val&& v) { m_targ.append(std::forward(v).get(), std::forward(v).length()); } template::value,void*> = nullptr, class = decltype(std::declval().size())> constexpr void operator()(Val&& v) { m_targ.append(std::forward(v).get(), std::forward(v).size()); } }; } #endif