gecko/media/mtransport/runnable_utils.py

112 lines
3.0 KiB
Python

MAX_ARGS = 10
def gen_args_type(args):
ret = ["C o", "M m"]
for arg in range(0, args):
ret.append("A%d a%d"%(arg, arg))
return ", ".join(ret)
def gen_args(args):
ret = ["o", "m"]
for arg in range(0, args):
ret.append("a%d"%(arg))
return ", ".join(ret)
def gen_args_(args):
ret = []
for arg in range(0, args):
ret.append("a%d_"%(arg))
return ", ".join(ret)
def gen_init(args, r = False):
ret = ["o_(o)", "m_(m)"]
if r:
ret.append("r_(r)")
for arg in range(0, args):
ret.append("a%d_(a%d)"%(arg, arg))
return ", ".join(ret)
def gen_typenames(args):
ret = ["typename C", "typename M"]
for arg in range(0, args):
ret.append("typename A%d"%(arg))
return ", ".join(ret)
def gen_types(args):
ret = ["C", "M"]
for arg in range(0, args):
ret.append("A%d"%(arg))
return ", ".join(ret)
def generate_class_template(args, ret = False):
print "// %d arguments --"%args
if not ret:
print "template<"+ gen_typenames(args) + "> class runnable_args%d : public runnable_args_base {"%args
else:
print "template<"+ gen_typenames(args) + ", typename R> class runnable_args%d_ret : public runnable_args_base {"%args
print " public:"
if not ret:
print " runnable_args%d("%args + gen_args_type(args) + ") :"
print " " + gen_init(args) + " {}"
else:
print " runnable_args%d_ret("%args + gen_args_type(args) + ", R *r) :"
print " " + gen_init(args, True) + " {}"
print
print " NS_IMETHOD Run() {"
if not ret:
print " ((*o_).*m_)(" + gen_args_(args) + ");"
else:
print " *r_ = ((*o_).*m_)(" + gen_args_(args) + ");"
print " return NS_OK;"
print " }"
print
print " private:"
print " C o_;"
print " M m_;"
if ret:
print " R* r_;"
for arg in range(0, args):
print " A%d a%d_;"%(arg, arg)
print "};"
print
print
print
def generate_function_template(args):
print "// %d arguments --"%args
print "template<" + gen_typenames(args) + ">"
print "runnable_args%d<"%args + gen_types(args) + ">* WrapRunnable(" + gen_args_type(args) + ") {"
print " return new runnable_args%d<"%args + gen_types(args) + ">"
print " (" + gen_args(args) + ");"
print "}"
print
def generate_function_template_ret(args):
print "// %d arguments --"%args
print "template<" + gen_typenames(args) + ", typename R>"
print "runnable_args%d_ret<"%args + gen_types(args) + ", R>* WrapRunnableRet(" + gen_args_type(args) + ", R* r) {"
print " return new runnable_args%d_ret<"%args + gen_types(args) + ", R>"
print " (" + gen_args(args) + ", r);"
print "}"
print
for num_args in range (0, MAX_ARGS):
generate_class_template(num_args)
generate_class_template(num_args, True)
print
print
print
for num_args in range(0, MAX_ARGS):
generate_function_template(num_args)
generate_function_template_ret(num_args)