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__())
 |