Add binding util for iterator to list

This commit is contained in:
Siu Kwan Lam 2013-01-28 15:20:36 -06:00
commit 821e937837

View file

@ -46,6 +46,7 @@ Void = BuiltinTypes('void')
Unsigned = BuiltinTypes('unsigned')
Bool = BuiltinTypes('bool')
ConstStdString = BuiltinTypes('const std::string')
PyObjectPtr = BuiltinTypes('PyObject*')
class Class(_Type):
format = 'O'
@ -81,6 +82,8 @@ class Class(_Type):
else:
for i in v:
self.includes.add(i)
elif k == '_realname_':
self.realname = v
elif k == '_downcast_':
if isinstance(v, Class):
self.downcastables.add(v)
@ -146,7 +149,7 @@ class Class(_Type):
writer.die_if_false(raw)
ptrty = ptr(self).fullname
ty = self.fullname
fmt = 'typecast<%(ty)s>::from(%(raw)s)'
fmt = 'typecast<%(ty)s >::from(%(raw)s)'
casted = writer.declare(ptrty, fmt % locals())
writer.die_if_false(casted)
return casted
@ -252,12 +255,8 @@ class Method(object):
writer.raises(TypeError, 'Invalid number of args')
def compile_cpp_body(self, writer, retty, argtys):
if isinstance(self.parent, Class):
args = writer.parse_arguments('args', ptr(self.parent), *argtys)
ret = writer.method_call(self.realname, retty.fullname, *args)
else:
args = writer.parse_arguments('args', *argtys)
ret = writer.call(self.fullname, retty.fullname, *args)
args = writer.parse_arguments('args', ptr(self.parent), *argtys)
ret = writer.method_call(self.realname, retty.fullname, *args)
writer.return_value(retty.wrap(writer, ret))
def compile_py(self, writer):
@ -273,6 +272,29 @@ class Method(object):
writer.println()
class IterToList(Method):
def __init__(self, elemty, argtys, iterty, begin, end):
super(IterToList, self).__init__(PyObjectPtr, *argtys)
self.elemty = elemty
self.iterty = iterty
self.begin = begin
self.end = end
def compile_cpp_body(self, writer, retty, argtys):
args = writer.parse_arguments('args', ptr(self.parent), *argtys)
it = writer.method_call(self.begin, self.iterty, *args)
end = writer.method_call(self.end, self.iterty, *args)
con = writer.call('PyList_New', 'PyObject*', '0')
writer.die_if_false(con)
with writer.block('for (; %(it)s != %(end)s; ++%(it)s)' % locals()):
elem = writer.declare(self.elemty.fullname, '*%(it)s;' % locals())
wrapped = self.elemty.wrap(writer, elem)
ok = writer.call('PyList_Append', 'int', con, wrapped)
with writer.block('if (%(ok)s == -1)' % locals()):
writer.return_value(None)
writer.return_value(con)
class StaticMethod(Method):
def compile_cpp_body(self, writer, retty, argtys):
@ -296,7 +318,6 @@ class StaticMethod(Method):
writer.return_value(wrapped)
writer.println()
class Function(Method):
_kind_ = 'func'
@ -305,6 +326,11 @@ class Function(Method):
self.parent = parent
self.name = name
def compile_cpp_body(self, writer, retty, argtys):
args = writer.parse_arguments('args', *argtys)
ret = writer.call(self.fullname, retty.fullname, *args)
writer.return_value(retty.wrap(writer, ret))
def compile_py(self, writer):
with writer.function(self.name, varargs='args') as varargs:
unwrapped = writer.unwrap_many(varargs)
@ -315,7 +341,6 @@ class Function(Method):
writer.return_value(wrapped)
writer.println()
class Destructor(Method):
_kind_ = 'dtor'