1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/mtransport/runnable_utils.py Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,173 @@ 1.4 +# This Source Code Form is subject to the terms of the Mozilla Public 1.5 +# License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 +# file, You can obtain one at http://mozilla.org/MPL/2.0/. 1.7 +MAX_ARGS = 15 1.8 + 1.9 +boilerplate = "/* This Source Code Form is subject to the terms of the Mozilla Public\n\ 1.10 + * License, v. 2.0. If a copy of the MPL was not distributed with this\n\ 1.11 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n" 1.12 + 1.13 +def gen_args_type(args, member): 1.14 + if member: 1.15 + ret = ["C o"] 1.16 + else: 1.17 + ret = [] 1.18 + ret.append("M m") 1.19 + for arg in range(0, args): 1.20 + ret.append("A%d a%d"%(arg, arg)) 1.21 + return ", ".join(ret) 1.22 + 1.23 +def gen_args(args, member): 1.24 + if member: 1.25 + ret = ["o"] 1.26 + else: 1.27 + ret = [] 1.28 + ret.append("m") 1.29 + for arg in range(0, args): 1.30 + ret.append("a%d"%(arg)) 1.31 + return ", ".join(ret) 1.32 + 1.33 +def gen_args_(args): 1.34 + ret = [] 1.35 + for arg in range(0, args): 1.36 + ret.append("a%d_"%(arg)) 1.37 + return ", ".join(ret) 1.38 + 1.39 +def gen_init(args, r = False, member = False): 1.40 + if member: 1.41 + ret = ["o_(o)"] 1.42 + else: 1.43 + ret = [] 1.44 + ret.append("m_(m)") 1.45 + 1.46 + if r: 1.47 + ret.append("r_(r)") 1.48 + 1.49 + for arg in range(0, args): 1.50 + ret.append("a%d_(a%d)"%(arg, arg)) 1.51 + return ", ".join(ret) 1.52 + 1.53 +def gen_typenames(args, member): 1.54 + if member: 1.55 + ret = ["typename C"] 1.56 + else: 1.57 + ret = [] 1.58 + ret.append("typename M") 1.59 + 1.60 + for arg in range(0, args): 1.61 + ret.append("typename A%d"%(arg)) 1.62 + return ", ".join(ret) 1.63 + 1.64 +def gen_types(args, member): 1.65 + if member: 1.66 + ret = ["C"] 1.67 + else: 1.68 + ret = [] 1.69 + ret.append("M") 1.70 + for arg in range(0, args): 1.71 + ret.append("A%d"%(arg)) 1.72 + return ", ".join(ret) 1.73 + 1.74 + 1.75 +def generate_class_template(args, ret = False, member = True): 1.76 + print "// %d arguments --"%args 1.77 + if member: 1.78 + nm = "m" 1.79 + else: 1.80 + nm = "nm" 1.81 + 1.82 + if not ret: 1.83 + print "template<"+ gen_typenames(args, member) + "> class runnable_args_%s_%d : public runnable_args_base {"%(nm, args) 1.84 + else: 1.85 + print "template<"+ gen_typenames(args, member) + ", typename R> class runnable_args_%s_%d_ret : public runnable_args_base {"%(nm, args) 1.86 + 1.87 + print " public:" 1.88 + 1.89 + if not ret: 1.90 + print " runnable_args_%s_%d("%(nm, args) + gen_args_type(args, member) + ") :" 1.91 + print " " + gen_init(args, False, member) + " {}" 1.92 + else: 1.93 + print " runnable_args_%s_%d_ret("%(nm, args) + gen_args_type(args, member) + ", R *r) :" 1.94 + print " " + gen_init(args, True, member) + " {}" 1.95 + print " virtual bool returns_value() const { return true; }" 1.96 + print 1.97 + print " NS_IMETHOD Run() {" 1.98 + if ret: 1.99 + print " *r_ =", 1.100 + else: 1.101 + print " ", 1.102 + if member: 1.103 + print "((*o_).*m_)(" + gen_args_(args) + ");" 1.104 + else: 1.105 + print "m_(" + gen_args_(args) + ");" 1.106 + 1.107 + print " return NS_OK;" 1.108 + print " }" 1.109 + print 1.110 + print " private:" 1.111 + if member: 1.112 + print " C o_;" 1.113 + print " M m_;" 1.114 + if ret: 1.115 + print " R* r_;" 1.116 + for arg in range(0, args): 1.117 + print " A%d a%d_;"%(arg, arg) 1.118 + print "};" 1.119 + print 1.120 + print 1.121 + print 1.122 + 1.123 +def generate_function_template(args, member): 1.124 + if member: 1.125 + nm = "m" 1.126 + NM = ""; 1.127 + else: 1.128 + nm = "nm" 1.129 + NM = "NM"; 1.130 + 1.131 + print "// %d arguments --"%args 1.132 + print "template<" + gen_typenames(args, member) + ">" 1.133 + print "runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">* WrapRunnable%s("%NM + gen_args_type(args, member) + ") {" 1.134 + print " return new runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">" 1.135 + print " (" + gen_args(args, member) + ");" 1.136 + print "}" 1.137 + print 1.138 + 1.139 +def generate_function_template_ret(args, member): 1.140 + if member: 1.141 + nm = "m" 1.142 + NM = ""; 1.143 + else: 1.144 + nm = "nm" 1.145 + NM = "NM"; 1.146 + print "// %d arguments --"%args 1.147 + print "template<" + gen_typenames(args, member) + ", typename R>" 1.148 + print "runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>* WrapRunnable%sRet("%NM + gen_args_type(args, member) + ", R* r) {" 1.149 + print " return new runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>" 1.150 + print " (" + gen_args(args, member) + ", r);" 1.151 + print "}" 1.152 + print 1.153 + 1.154 + 1.155 +print boilerplate 1.156 +print 1.157 + 1.158 +for num_args in range (0, MAX_ARGS): 1.159 + generate_class_template(num_args, False, False) 1.160 + generate_class_template(num_args, True, False) 1.161 + generate_class_template(num_args, False, True) 1.162 + generate_class_template(num_args, True, True) 1.163 + 1.164 + 1.165 +print 1.166 +print 1.167 +print 1.168 + 1.169 +for num_args in range(0, MAX_ARGS): 1.170 + generate_function_template(num_args, False) 1.171 + generate_function_template_ret(num_args, False) 1.172 + generate_function_template(num_args, True) 1.173 + generate_function_template_ret(num_args, True) 1.174 + 1.175 + 1.176 +