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