Bumping manifests a=b2g-bump
[gecko.git] / media / mtransport / runnable_utils.py
blob50c5994753723cef12ecaa19787479e1e81bbe17
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4 MAX_ARGS = 15
6 boilerplate = "/* This Source Code Form is subject to the terms of the Mozilla Public\n\
7 * License, v. 2.0. If a copy of the MPL was not distributed with this\n\
8 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n"
10 def get_args_count(args, member):
11 if member:
12 return args + 2
13 return args + 1
15 def gen_args_type(args, member):
16 if member:
17 ret = ["C o"]
18 else:
19 ret = []
20 ret.append("M m")
21 for arg in range(0, args):
22 ret.append("A%d a%d"%(arg, arg))
23 return ", ".join(ret)
25 def gen_args(args, member):
26 if member:
27 ret = ["o"]
28 else:
29 ret = []
30 ret.append("m")
31 for arg in range(0, args):
32 ret.append("a%d"%(arg))
33 return ", ".join(ret)
35 def gen_args_(args):
36 ret = []
37 for arg in range(0, args):
38 ret.append("a%d_"%(arg))
39 return ", ".join(ret)
41 def gen_init(args, r = False, member = False):
42 if member:
43 ret = ["o_(o)"]
44 else:
45 ret = []
46 ret.append("m_(m)")
48 if r:
49 ret.append("r_(r)")
51 for arg in range(0, args):
52 ret.append("a%d_(a%d)"%(arg, arg))
53 return ", ".join(ret)
55 def gen_typenames(args, member):
56 if member:
57 ret = ["typename C"]
58 else:
59 ret = []
60 ret.append("typename M")
62 for arg in range(0, args):
63 ret.append("typename A%d"%(arg))
64 return ", ".join(ret)
66 def gen_types(args, member):
67 if member:
68 ret = ["C"]
69 else:
70 ret = []
71 ret.append("M")
72 for arg in range(0, args):
73 ret.append("A%d"%(arg))
74 return ", ".join(ret)
77 def runnable_class_name(args, ret=False, member=True):
78 if member:
79 nm = "m"
80 else:
81 nm = "nm"
83 if ret:
84 class_suffix = "_ret"
85 enum_specializer = "detail::ReturnsResult"
86 else:
87 class_suffix = ""
88 enum_specializer = "detail::NoResult"
90 return "runnable_args_%s_%d%s" % (nm, args, class_suffix), enum_specializer
92 def generate_class_template(args, ret = False, member = True):
93 print "// %d arguments --"%args
95 class_name, specializer = runnable_class_name(args, ret, member)
96 base_class = "detail::runnable_args_base<%s>" % specializer
98 if not ret:
99 print "template<"+ gen_typenames(args, member) + "> class %s : public %s {" % (class_name, base_class)
100 else:
101 print "template<"+ gen_typenames(args, member) + ", typename R> class %s : public %s {" % (class_name, base_class)
103 print " public:"
105 if not ret:
106 explicit = ""
107 if get_args_count(args, member) == 1:
108 explicit = "explicit "
109 print " %s%s(" % (explicit, class_name) + gen_args_type(args, member) + ") :"
110 print " " + gen_init(args, False, member) + " {}"
111 else:
112 print " %s(" % class_name + gen_args_type(args, member) + ", R *r) :"
113 print " " + gen_init(args, True, member) + " {}"
114 print
115 print " NS_IMETHOD Run() {"
116 if ret:
117 print " *r_ =",
118 else:
119 print " ",
120 if member:
121 print "((*o_).*m_)(" + gen_args_(args) + ");"
122 else:
123 print "m_(" + gen_args_(args) + ");"
125 print " return NS_OK;"
126 print " }"
127 print
128 print " private:"
129 if member:
130 print " C o_;"
131 print " M m_;"
132 if ret:
133 print " R* r_;"
134 for arg in range(0, args):
135 print " A%d a%d_;"%(arg, arg)
136 print "};"
137 print
138 print
139 print
141 def generate_function_template(args, member):
142 if member:
143 NM = "";
144 else:
145 NM = "NM";
147 class_name, _ = runnable_class_name(args, False, member)
149 print "// %d arguments --"%args
150 print "template<" + gen_typenames(args, member) + ">"
151 print "%s<" % class_name + gen_types(args, member) + ">* WrapRunnable%s("%NM + gen_args_type(args, member) + ") {"
152 print " return new %s<" % class_name + gen_types(args, member) + ">"
153 print " (" + gen_args(args, member) + ");"
154 print "}"
155 print
157 def generate_function_template_ret(args, member):
158 if member:
159 NM = "";
160 else:
161 NM = "NM";
163 class_name, _ = runnable_class_name(args, True, member)
165 print "// %d arguments --"%args
166 print "template<" + gen_typenames(args, member) + ", typename R>"
167 print "%s<" % class_name + gen_types(args, member) + ", R>* WrapRunnable%sRet("%NM + gen_args_type(args, member) + ", R* r) {"
168 print " return new %s<" % class_name + gen_types(args, member) + ", R>"
169 print " (" + gen_args(args, member) + ", r);"
170 print "}"
171 print
174 print boilerplate
175 print
177 for num_args in range (0, MAX_ARGS):
178 generate_class_template(num_args, False, False)
179 generate_class_template(num_args, True, False)
180 generate_class_template(num_args, False, True)
181 generate_class_template(num_args, True, True)
184 print
185 print
186 print
188 for num_args in range(0, MAX_ARGS):
189 generate_function_template(num_args, False)
190 generate_function_template_ret(num_args, False)
191 generate_function_template(num_args, True)
192 generate_function_template_ret(num_args, True)