efl/src/lib/eolian_cxx/grammar/eo_class_functions_generato...

85 lines
2.0 KiB
C++

#ifndef EOLIAN_CXX_STD_EO_CLASS_FUNCTIONS_GENERATOR_HH
#define EOLIAN_CXX_STD_EO_CLASS_FUNCTIONS_GENERATOR_HH
#include <iosfwd>
#include "eo_types.hh"
#include "tab.hh"
#include "comment.hh"
#include "parameters_generator.hh"
namespace efl { namespace eolian { namespace grammar {
struct function_call
{
eo_function const& _func;
function_call(eo_function const& func) : _func(func) {}
};
inline std::ostream&
operator<<(std::ostream& out, function_call const& x)
{
bool is_void = function_is_void(x._func);
out << (!is_void ? "_tmp_ret = " : "")
<< "::" << x._func.impl
<< "(" << parameters_list(x._func.params) << ")";
return out;
}
struct function
{
eo_function const& _func;
function(eo_function const& func) : _func(func) {}
};
inline std::ostream&
operator<<(std::ostream& out, function const& x)
{
eo_function const& func = x._func;
bool is_void = function_is_void(func);
out << comment(x._func.comment, 1)
<< tab(1)
<< ( func.type == eo_function::class_ ? "static " : "" )
<< func.ret << " " << func.name << "("
<< parameters_declaration(func.params)
<< ") const" << endl
<< tab(1) << "{" << endl;
if (!is_void)
{
out << tab(2) << func.ret << " _tmp_ret;" << endl;
}
out << tab(2) << "eo_do(_eo_ptr(), "
<< function_call(x._func)
<< ");" << endl;
if (!is_void)
{
out << tab(2) << "return _tmp_ret;" << endl;
}
out << tab(1) << "}" << endl;
return out;
}
struct functions
{
functions_container_type const& _funcs;
functions(functions_container_type const& funcs) : _funcs(funcs) {}
};
inline std::ostream&
operator<<(std::ostream& out, functions const& x)
{
functions_container_type::const_iterator it,
first = x._funcs.begin(),
last = x._funcs.end();
for (it = first; it != last; it++)
{
out << function(*it) << endl;
}
return out;
}
} } } // namespace efl { namespace eolian { namespace grammar {
#endif // EOLIAN_CXX_STD_EO_CLASS_FUNCTIONS_GENERATOR_HH