openh264/module/task_utils.py

208 lines
5.5 KiB
Python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
MAX_ARGS = 15
boilerplate = "/* This Source Code Form is subject to the terms of the Mozilla Public\n\
* License, v. 2.0. If a copy of the MPL was not distributed with this\n\
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n"
includes = "#include \"RefCounted.h\"\n"
refcountclass = "class RefCountTaskWrapper : public gmp_args_base {\n\
public:\n\
RefCountTaskWrapper(GMPTask* aTask, RefCounted* aRefCounted)\n\
: mTask(aTask)\n\
, mRefCounted(aRefCounted)\n\
{}\n\
virtual void Run() {\n\
mTask->Run();\n\
}\n\
virtual void Destroy() {\n\
mTask->Destroy();\n\
gmp_args_base::Destroy();\n\
}\n\
private:\n\
~RefCountTaskWrapper() {}\n\
\n\
GMPTask* mTask;\n\
RefPtr<RefCounted> mRefCounted;\n\
};\n"
def gen_args_type(args, member):
if member:
ret = ["C o"]
else:
ret = []
ret.append("M m")
for arg in range(0, args):
ret.append("A%d a%d"%(arg, arg))
return ", ".join(ret)
def gen_args(args, member):
if member:
ret = ["o"]
else:
ret = []
ret.append("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, member = False):
if member:
ret = ["o_ (o)"]
else:
ret = []
ret.append("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, member):
if member:
ret = ["typename C"]
else:
ret = []
ret.append("typename M")
for arg in range(0, args):
ret.append("typename A%d"%(arg))
return ", ".join(ret)
def gen_types(args, member):
if member:
ret = ["C"]
else:
ret = []
ret.append("M")
for arg in range(0, args):
ret.append("A%d"%(arg))
return ", ".join(ret)
def generate_class_template(args, ret = False, member = True):
print "// %d arguments --"%args
if member:
nm = "m"
else:
nm = "nm"
if not ret:
print "template<"+ gen_typenames(args, member) + "> class gmp_args_%s_%d : public gmp_args_base {"%(nm, args)
else:
print "template<"+ gen_typenames(args, member) + ", typename R> class gmp_args_%s_%d_ret : public gmp_args_base {"%(nm, args)
print " public:"
if not ret:
print " gmp_args_%s_%d ("%(nm, args) + gen_args_type(args, member) + ") :"
print " " + gen_init(args, False, member) + " {}"
else:
print " gmp_args_%s_%d_ret ("%(nm, args) + gen_args_type(args, member) + ", R* r) :"
print " " + gen_init(args, True, member) + " {}"
print " virtual bool returns_value() const {\n return true;\n }"
print
print " void Run() {"
if ret:
print " *r_ =",
else:
print " ",
if member:
print "((*o_).*m_) (" + gen_args_(args) + ");"
else:
print "m_ (" + gen_args_(args) + ");"
print " }"
print
print " private:"
if member:
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, member):
if member:
nm = "m"
NM = "";
else:
nm = "nm"
NM = "NM";
print "// %d arguments --"%args
print "template<" + gen_typenames(args, member) + ">"
print "gmp_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">* WrapTask%s ("%NM + gen_args_type(args, member) + ") {"
print " return new gmp_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">"
print " (" + gen_args(args, member) + ");"
print "}"
print
if member:
print "template<" + gen_typenames(args, member) + ">"
print "GMPTask*"
print "WrapTaskRefCounted%s ("%NM + gen_args_type(args, member) + ") {"
print " GMPTask *t = WrapTask%s ("%NM + gen_args(args, member) + ");"
print " return new RefCountTaskWrapper(t, o);"
print "}"
print
def generate_function_template_ret(args, member):
if member:
nm = "m"
NM = "";
else:
nm = "nm"
NM = "NM";
print "// %d arguments --"%args
print "template<" + gen_typenames(args, member) + ", typename R>"
print "gmp_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>* WrapTask%sRet ("%NM + gen_args_type(args, member) + ", R* r) {"
print " return new gmp_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>"
print " (" + gen_args(args, member) + ", r);"
print "}"
print
print boilerplate
print
print includes
print
print refcountclass
print
for num_args in range (0, MAX_ARGS):
generate_class_template(num_args, False, False)
generate_class_template(num_args, True, False)
generate_class_template(num_args, False, True)
generate_class_template(num_args, True, True)
print
print
print
for num_args in range(0, MAX_ARGS):
generate_function_template(num_args, False)
generate_function_template_ret(num_args, False)
generate_function_template(num_args, True)
generate_function_template_ret(num_args, True)