michael@0: # This Source Code Form is subject to the terms of the Mozilla Public michael@0: # License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: # file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: MAX_ARGS = 15 michael@0: michael@0: boilerplate = "/* This Source Code Form is subject to the terms of the Mozilla Public\n\ michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this\n\ michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n" michael@0: michael@0: def gen_args_type(args, member): michael@0: if member: michael@0: ret = ["C o"] michael@0: else: michael@0: ret = [] michael@0: ret.append("M m") michael@0: for arg in range(0, args): michael@0: ret.append("A%d a%d"%(arg, arg)) michael@0: return ", ".join(ret) michael@0: michael@0: def gen_args(args, member): michael@0: if member: michael@0: ret = ["o"] michael@0: else: michael@0: ret = [] michael@0: ret.append("m") michael@0: for arg in range(0, args): michael@0: ret.append("a%d"%(arg)) michael@0: return ", ".join(ret) michael@0: michael@0: def gen_args_(args): michael@0: ret = [] michael@0: for arg in range(0, args): michael@0: ret.append("a%d_"%(arg)) michael@0: return ", ".join(ret) michael@0: michael@0: def gen_init(args, r = False, member = False): michael@0: if member: michael@0: ret = ["o_(o)"] michael@0: else: michael@0: ret = [] michael@0: ret.append("m_(m)") michael@0: michael@0: if r: michael@0: ret.append("r_(r)") michael@0: michael@0: for arg in range(0, args): michael@0: ret.append("a%d_(a%d)"%(arg, arg)) michael@0: return ", ".join(ret) michael@0: michael@0: def gen_typenames(args, member): michael@0: if member: michael@0: ret = ["typename C"] michael@0: else: michael@0: ret = [] michael@0: ret.append("typename M") michael@0: michael@0: for arg in range(0, args): michael@0: ret.append("typename A%d"%(arg)) michael@0: return ", ".join(ret) michael@0: michael@0: def gen_types(args, member): michael@0: if member: michael@0: ret = ["C"] michael@0: else: michael@0: ret = [] michael@0: ret.append("M") michael@0: for arg in range(0, args): michael@0: ret.append("A%d"%(arg)) michael@0: return ", ".join(ret) michael@0: michael@0: michael@0: def generate_class_template(args, ret = False, member = True): michael@0: print "// %d arguments --"%args michael@0: if member: michael@0: nm = "m" michael@0: else: michael@0: nm = "nm" michael@0: michael@0: if not ret: michael@0: print "template<"+ gen_typenames(args, member) + "> class runnable_args_%s_%d : public runnable_args_base {"%(nm, args) michael@0: else: michael@0: print "template<"+ gen_typenames(args, member) + ", typename R> class runnable_args_%s_%d_ret : public runnable_args_base {"%(nm, args) michael@0: michael@0: print " public:" michael@0: michael@0: if not ret: michael@0: print " runnable_args_%s_%d("%(nm, args) + gen_args_type(args, member) + ") :" michael@0: print " " + gen_init(args, False, member) + " {}" michael@0: else: michael@0: print " runnable_args_%s_%d_ret("%(nm, args) + gen_args_type(args, member) + ", R *r) :" michael@0: print " " + gen_init(args, True, member) + " {}" michael@0: print " virtual bool returns_value() const { return true; }" michael@0: print michael@0: print " NS_IMETHOD Run() {" michael@0: if ret: michael@0: print " *r_ =", michael@0: else: michael@0: print " ", michael@0: if member: michael@0: print "((*o_).*m_)(" + gen_args_(args) + ");" michael@0: else: michael@0: print "m_(" + gen_args_(args) + ");" michael@0: michael@0: print " return NS_OK;" michael@0: print " }" michael@0: print michael@0: print " private:" michael@0: if member: michael@0: print " C o_;" michael@0: print " M m_;" michael@0: if ret: michael@0: print " R* r_;" michael@0: for arg in range(0, args): michael@0: print " A%d a%d_;"%(arg, arg) michael@0: print "};" michael@0: print michael@0: print michael@0: print michael@0: michael@0: def generate_function_template(args, member): michael@0: if member: michael@0: nm = "m" michael@0: NM = ""; michael@0: else: michael@0: nm = "nm" michael@0: NM = "NM"; michael@0: michael@0: print "// %d arguments --"%args michael@0: print "template<" + gen_typenames(args, member) + ">" michael@0: print "runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">* WrapRunnable%s("%NM + gen_args_type(args, member) + ") {" michael@0: print " return new runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">" michael@0: print " (" + gen_args(args, member) + ");" michael@0: print "}" michael@0: print michael@0: michael@0: def generate_function_template_ret(args, member): michael@0: if member: michael@0: nm = "m" michael@0: NM = ""; michael@0: else: michael@0: nm = "nm" michael@0: NM = "NM"; michael@0: print "// %d arguments --"%args michael@0: print "template<" + gen_typenames(args, member) + ", typename R>" michael@0: print "runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>* WrapRunnable%sRet("%NM + gen_args_type(args, member) + ", R* r) {" michael@0: print " return new runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>" michael@0: print " (" + gen_args(args, member) + ", r);" michael@0: print "}" michael@0: print michael@0: michael@0: michael@0: print boilerplate michael@0: print michael@0: michael@0: for num_args in range (0, MAX_ARGS): michael@0: generate_class_template(num_args, False, False) michael@0: generate_class_template(num_args, True, False) michael@0: generate_class_template(num_args, False, True) michael@0: generate_class_template(num_args, True, True) michael@0: michael@0: michael@0: print michael@0: print michael@0: print michael@0: michael@0: for num_args in range(0, MAX_ARGS): michael@0: generate_function_template(num_args, False) michael@0: generate_function_template_ret(num_args, False) michael@0: generate_function_template(num_args, True) michael@0: generate_function_template_ret(num_args, True) michael@0: michael@0: michael@0: