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/.
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
):
15 def gen_args_type(args
, member
):
21 for arg
in range(0, args
):
22 ret
.append("A%d a%d"%(arg
, arg
))
25 def gen_args(args
, member
):
31 for arg
in range(0, args
):
32 ret
.append("a%d"%(arg))
37 for arg
in range(0, args
):
38 ret
.append("a%d_"%(arg))
41 def gen_init(args
, r
= False, member
= False):
51 for arg
in range(0, args
):
52 ret
.append("a%d_(a%d)"%(arg
, arg
))
55 def gen_typenames(args
, member
):
60 ret
.append("typename M")
62 for arg
in range(0, args
):
63 ret
.append("typename A%d"%(arg))
66 def gen_types(args
, member
):
72 for arg
in range(0, args
):
73 ret
.append("A%d"%(arg))
77 def runnable_class_name(args
, ret
=False, member
=True):
85 enum_specializer
= "detail::ReturnsResult"
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
99 print "template<"+ gen_typenames(args
, member
) + "> class %s : public %s {" % (class_name
, base_class
)
101 print "template<"+ gen_typenames(args
, member
) + ", typename R> class %s : public %s {" % (class_name
, base_class
)
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
) + " {}"
112 print " %s(" % class_name
+ gen_args_type(args
, member
) + ", R *r) :"
113 print " " + gen_init(args
, True, member
) + " {}"
115 print " NS_IMETHOD Run() {"
121 print "((*o_).*m_)(" + gen_args_(args
) + ");"
123 print "m_(" + gen_args_(args
) + ");"
125 print " return NS_OK;"
134 for arg
in range(0, args
):
135 print " A%d a%d_;"%(arg
, arg
)
141 def generate_function_template(args
, member
):
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
) + ");"
157 def generate_function_template_ret(args
, member
):
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);"
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)
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)