Add binding util for iterator to list
This commit is contained in:
parent
d1931cc499
commit
821e937837
1 changed files with 34 additions and 9 deletions
|
|
@ -46,6 +46,7 @@ Void = BuiltinTypes('void')
|
||||||
Unsigned = BuiltinTypes('unsigned')
|
Unsigned = BuiltinTypes('unsigned')
|
||||||
Bool = BuiltinTypes('bool')
|
Bool = BuiltinTypes('bool')
|
||||||
ConstStdString = BuiltinTypes('const std::string')
|
ConstStdString = BuiltinTypes('const std::string')
|
||||||
|
PyObjectPtr = BuiltinTypes('PyObject*')
|
||||||
|
|
||||||
class Class(_Type):
|
class Class(_Type):
|
||||||
format = 'O'
|
format = 'O'
|
||||||
|
|
@ -81,6 +82,8 @@ class Class(_Type):
|
||||||
else:
|
else:
|
||||||
for i in v:
|
for i in v:
|
||||||
self.includes.add(i)
|
self.includes.add(i)
|
||||||
|
elif k == '_realname_':
|
||||||
|
self.realname = v
|
||||||
elif k == '_downcast_':
|
elif k == '_downcast_':
|
||||||
if isinstance(v, Class):
|
if isinstance(v, Class):
|
||||||
self.downcastables.add(v)
|
self.downcastables.add(v)
|
||||||
|
|
@ -146,7 +149,7 @@ class Class(_Type):
|
||||||
writer.die_if_false(raw)
|
writer.die_if_false(raw)
|
||||||
ptrty = ptr(self).fullname
|
ptrty = ptr(self).fullname
|
||||||
ty = 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())
|
casted = writer.declare(ptrty, fmt % locals())
|
||||||
writer.die_if_false(casted)
|
writer.die_if_false(casted)
|
||||||
return casted
|
return casted
|
||||||
|
|
@ -252,12 +255,8 @@ class Method(object):
|
||||||
writer.raises(TypeError, 'Invalid number of args')
|
writer.raises(TypeError, 'Invalid number of args')
|
||||||
|
|
||||||
def compile_cpp_body(self, writer, retty, argtys):
|
def compile_cpp_body(self, writer, retty, argtys):
|
||||||
if isinstance(self.parent, Class):
|
args = writer.parse_arguments('args', ptr(self.parent), *argtys)
|
||||||
args = writer.parse_arguments('args', ptr(self.parent), *argtys)
|
ret = writer.method_call(self.realname, retty.fullname, *args)
|
||||||
ret = writer.method_call(self.realname, retty.fullname, *args)
|
|
||||||
else:
|
|
||||||
args = writer.parse_arguments('args', *argtys)
|
|
||||||
ret = writer.call(self.fullname, retty.fullname, *args)
|
|
||||||
writer.return_value(retty.wrap(writer, ret))
|
writer.return_value(retty.wrap(writer, ret))
|
||||||
|
|
||||||
def compile_py(self, writer):
|
def compile_py(self, writer):
|
||||||
|
|
@ -273,6 +272,29 @@ class Method(object):
|
||||||
writer.println()
|
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):
|
class StaticMethod(Method):
|
||||||
|
|
||||||
def compile_cpp_body(self, writer, retty, argtys):
|
def compile_cpp_body(self, writer, retty, argtys):
|
||||||
|
|
@ -296,7 +318,6 @@ class StaticMethod(Method):
|
||||||
writer.return_value(wrapped)
|
writer.return_value(wrapped)
|
||||||
writer.println()
|
writer.println()
|
||||||
|
|
||||||
|
|
||||||
class Function(Method):
|
class Function(Method):
|
||||||
_kind_ = 'func'
|
_kind_ = 'func'
|
||||||
|
|
||||||
|
|
@ -305,6 +326,11 @@ class Function(Method):
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.name = name
|
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):
|
def compile_py(self, writer):
|
||||||
with writer.function(self.name, varargs='args') as varargs:
|
with writer.function(self.name, varargs='args') as varargs:
|
||||||
unwrapped = writer.unwrap_many(varargs)
|
unwrapped = writer.unwrap_many(varargs)
|
||||||
|
|
@ -315,7 +341,6 @@ class Function(Method):
|
||||||
writer.return_value(wrapped)
|
writer.return_value(wrapped)
|
||||||
writer.println()
|
writer.println()
|
||||||
|
|
||||||
|
|
||||||
class Destructor(Method):
|
class Destructor(Method):
|
||||||
_kind_ = 'dtor'
|
_kind_ = 'dtor'
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue