65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
"""Class constructor instantiator."""
 | 
						|
 | 
						|
# pylint: disable=unused-argument
 | 
						|
 | 
						|
from typing import Iterable, List
 | 
						|
 | 
						|
import gtwrap.interface_parser as parser
 | 
						|
 | 
						|
 | 
						|
class InstantiatedConstructor(parser.Constructor):
 | 
						|
    """
 | 
						|
    Instantiate constructor with template parameters.
 | 
						|
 | 
						|
    E.g.
 | 
						|
    class A {
 | 
						|
        template<X, Y>
 | 
						|
        A(X x, Y y);
 | 
						|
    }
 | 
						|
    """
 | 
						|
    def __init__(self,
 | 
						|
                 original: parser.Constructor,
 | 
						|
                 instantiations: Iterable[parser.Typename] = ()):
 | 
						|
        self.original = original
 | 
						|
        self.instantiations = instantiations
 | 
						|
        self.name = original.name
 | 
						|
        self.args = original.args
 | 
						|
        self.template = original.template
 | 
						|
        self.parent = original.parent
 | 
						|
 | 
						|
        super().__init__(self.name,
 | 
						|
                         self.args,
 | 
						|
                         self.template,
 | 
						|
                         parent=self.parent)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def construct(cls, original: parser.Constructor, typenames: List[str],
 | 
						|
                  class_instantiations: List[parser.Typename],
 | 
						|
                  method_instantiations: List[parser.Typename],
 | 
						|
                  instantiated_args: List[parser.Argument],
 | 
						|
                  parent: 'InstantiatedClass'):
 | 
						|
        """Class method to construct object as required by InstantiationHelper."""
 | 
						|
        method = parser.Constructor(
 | 
						|
            name=parent.name,
 | 
						|
            args=parser.ArgumentList(instantiated_args),
 | 
						|
            template=original.template,
 | 
						|
            parent=parent,
 | 
						|
        )
 | 
						|
        return InstantiatedConstructor(method,
 | 
						|
                                       instantiations=method_instantiations)
 | 
						|
 | 
						|
    def to_cpp(self):
 | 
						|
        """Generate the C++ code for wrapping."""
 | 
						|
        if self.original.template:
 | 
						|
            # to_cpp will handle all the namespacing and templating
 | 
						|
            instantiation_list = [x.to_cpp() for x in self.instantiations]
 | 
						|
            # now can simply combine the instantiations, separated by commas
 | 
						|
            ret = "{}<{}>".format(self.original.name,
 | 
						|
                                  ",".join(instantiation_list))
 | 
						|
        else:
 | 
						|
            ret = self.original.name
 | 
						|
        return ret
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return "Instantiated {}".format(super().__repr__())
 |