Support C++ class reference parameters with default values (crazy as it may sound)
This commit is contained in:
1 parent
6da3c7f2b0
commit
538a65cacf
2 files changed
+25
-9
No files matched your search
+20
-8
@@ -1490,7 +1490,7 @@ class CppClassRefParameter(CppClassParameterBase):
|
||||
Parameter.DIRECTION_OUT,
|
||||
Parameter.DIRECTION_INOUT]
|
||||
|
||||
def __init__(self, ctype, name, direction=Parameter.DIRECTION_IN, is_const=False):
|
||||
def __init__(self, ctype, name, direction=Parameter.DIRECTION_IN, is_const=False, default_value=None):
|
||||
"""
|
||||
ctype -- C type, normally 'MyClass*'
|
||||
name -- parameter name
|
||||
@@ -1498,7 +1498,7 @@ class CppClassRefParameter(CppClassParameterBase):
|
||||
if ctype == self.cpp_class.name:
|
||||
ctype = self.cpp_class.full_name
|
||||
super(CppClassRefParameter, self).__init__(
|
||||
ctype, name, direction, is_const)
|
||||
ctype, name, direction, is_const, default_value)
|
||||
|
||||
def convert_python_to_c(self, wrapper):
|
||||
"parses python args to get C++ value"
|
||||
@@ -1514,13 +1514,25 @@ class CppClassRefParameter(CppClassParameterBase):
|
||||
else:
|
||||
implicit_conversion_sources = self.cpp_class.get_all_implicit_conversions()
|
||||
if not (implicit_conversion_sources and self.is_const):
|
||||
self.py_name = wrapper.declarations.declare_variable(
|
||||
self.cpp_class.pystruct+'*', self.name)
|
||||
wrapper.parse_params.add_parameter(
|
||||
'O!', ['&'+self.cpp_class.pytypestruct, '&'+self.py_name], self.name)
|
||||
wrapper.call_params.append(
|
||||
'*((%s *) %s)->obj' % (self.cpp_class.pystruct, self.py_name))
|
||||
if self.default_value:
|
||||
self.py_name = wrapper.declarations.declare_variable(
|
||||
self.cpp_class.pystruct+'*', self.name, 'NULL')
|
||||
wrapper.parse_params.add_parameter(
|
||||
'O!', ['&'+self.cpp_class.pytypestruct, '&'+self.py_name], self.name, optional=True)
|
||||
wrapper.call_params.append(
|
||||
'(%s ? (*((%s *) %s)->obj) : %s)' % (self.py_name, self.cpp_class.pystruct,
|
||||
self.py_name, self.default_value))
|
||||
else:
|
||||
self.py_name = wrapper.declarations.declare_variable(
|
||||
self.cpp_class.pystruct+'*', self.name)
|
||||
wrapper.parse_params.add_parameter(
|
||||
'O!', ['&'+self.cpp_class.pytypestruct, '&'+self.py_name], self.name)
|
||||
wrapper.call_params.append(
|
||||
'*((%s *) %s)->obj' % (self.cpp_class.pystruct, self.py_name))
|
||||
else:
|
||||
if self.default_value:
|
||||
warnings.warn("with implicit conversions, default value "
|
||||
"in C++ class reference parameters is ignored.")
|
||||
self.py_name = wrapper.declarations.declare_variable(
|
||||
'PyObject*', self.name)
|
||||
tmp_value_variable = wrapper.declarations.declare_variable(
|
||||
|
||||
@@ -241,7 +241,11 @@ class GccXmlTypeRegistry(object):
|
||||
## here is a Bad Idea™
|
||||
return cpp_class.ThisClassPtrParameter(type_info.decl_string, param_name, **kwargs)
|
||||
if not is_pointer and is_reference:
|
||||
return cpp_class.ThisClassRefParameter(type_info.decl_string, param_name, **kwargs)
|
||||
try:
|
||||
return cpp_class.ThisClassRefParameter(type_info.decl_string, param_name, **kwargs)
|
||||
except TypeError:
|
||||
print >> sys.stderr, "** Error in %s class ref parameter" % cpp_class.full_name
|
||||
raise
|
||||
assert 0, "this line should not be reached"
|
||||
|
||||
type_registry = GccXmlTypeRegistry()
|
||||
|
||||
Reference in new issue
Block a user