69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
"""Instantiate global function."""
|
|
|
|
import gtwrap.interface_parser as parser
|
|
from gtwrap.template_instantiator.helpers import (instantiate_args_list,
|
|
instantiate_name,
|
|
instantiate_return_type)
|
|
|
|
|
|
class InstantiatedGlobalFunction(parser.GlobalFunction):
|
|
"""
|
|
Instantiate global functions.
|
|
|
|
E.g.
|
|
template<T = {double}>
|
|
T add(const T& x, const T& y);
|
|
"""
|
|
def __init__(self, original, instantiations=(), new_name=''):
|
|
self.original = original
|
|
self.instantiations = instantiations
|
|
self.template = ''
|
|
self.parent = original.parent
|
|
|
|
if not original.template:
|
|
self.name = original.name
|
|
self.return_type = original.return_type
|
|
self.args = original.args
|
|
else:
|
|
self.name = instantiate_name(
|
|
original.name, instantiations) if not new_name else new_name
|
|
self.return_type = instantiate_return_type(
|
|
original.return_type,
|
|
self.original.template.typenames,
|
|
self.instantiations,
|
|
# Keyword type name `This` should already be replaced in the
|
|
# previous class template instantiation round.
|
|
cpp_typename='',
|
|
)
|
|
instantiated_args = instantiate_args_list(
|
|
original.args.list(),
|
|
self.original.template.typenames,
|
|
self.instantiations,
|
|
# Keyword type name `This` should already be replaced in the
|
|
# previous class template instantiation round.
|
|
cpp_typename='',
|
|
)
|
|
self.args = parser.ArgumentList(instantiated_args)
|
|
|
|
super().__init__(self.name,
|
|
self.return_type,
|
|
self.args,
|
|
self.template,
|
|
parent=self.parent)
|
|
|
|
def to_cpp(self):
|
|
"""Generate the C++ code for wrapping."""
|
|
if self.original.template:
|
|
instantiated_names = [
|
|
inst.instantiated_name() for inst in self.instantiations
|
|
]
|
|
ret = "{}<{}>".format(self.original.name,
|
|
",".join(instantiated_names))
|
|
else:
|
|
ret = self.original.name
|
|
return ret
|
|
|
|
def __repr__(self):
|
|
return "Instantiated {}".format(
|
|
super(InstantiatedGlobalFunction, self).__repr__())
|