46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
"""Instantiate a forward declaration."""
|
|
|
|
import gtwrap.interface_parser as parser
|
|
from gtwrap.template_instantiator.helpers import instantiate_name
|
|
|
|
|
|
class InstantiatedDeclaration(parser.ForwardDeclaration):
|
|
"""
|
|
Instantiate typedefs of forward declarations.
|
|
This is useful when we wish to typedef a templated class
|
|
which is not defined in the current project.
|
|
|
|
E.g.
|
|
class FactorFromAnotherMother;
|
|
|
|
typedef FactorFromAnotherMother<gtsam::Pose3> FactorWeCanUse;
|
|
"""
|
|
def __init__(self, original, instantiations=(), new_name=''):
|
|
super().__init__(original.typename,
|
|
original.parent_type,
|
|
original.is_virtual,
|
|
parent=original.parent)
|
|
|
|
self.original = original
|
|
self.instantiations = instantiations
|
|
self.parent = original.parent
|
|
|
|
self.name = instantiate_name(
|
|
original.name, instantiations) if not new_name else new_name
|
|
|
|
def to_cpp(self):
|
|
"""Generate the C++ code for wrapping."""
|
|
instantiated_names = [
|
|
inst.qualified_name() for inst in self.instantiations
|
|
]
|
|
name = "{}<{}>".format(self.original.name,
|
|
",".join(instantiated_names))
|
|
namespaces_name = self.namespaces()
|
|
namespaces_name.append(name)
|
|
# Leverage Typename to generate the fully qualified C++ name
|
|
return parser.Typename(namespaces_name).to_cpp()
|
|
|
|
def __repr__(self):
|
|
return "Instantiated {}".format(
|
|
super(InstantiatedDeclaration, self).__repr__())
|