125 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
|  | """Class method and static method instantiators.""" | ||
|  | 
 | ||
|  | from typing import Iterable | ||
|  | 
 | ||
|  | import gtwrap.interface_parser as parser | ||
|  | from gtwrap.template_instantiator.helpers import (instantiate_name, | ||
|  |                                                   instantiate_return_type) | ||
|  | 
 | ||
|  | 
 | ||
|  | class InstantiatedMethod(parser.Method): | ||
|  |     """
 | ||
|  |     Instantiate method with template parameters. | ||
|  | 
 | ||
|  |     E.g. | ||
|  |     class A { | ||
|  |         template<X, Y> | ||
|  |         void func(X x, Y y); | ||
|  |     } | ||
|  |     """
 | ||
|  |     def __init__(self, | ||
|  |                  original: parser.Method, | ||
|  |                  instantiations: Iterable[parser.Typename] = ()): | ||
|  |         self.original = original | ||
|  |         self.instantiations = instantiations | ||
|  |         self.template = original.template | ||
|  |         self.is_const = original.is_const | ||
|  |         self.parent = original.parent | ||
|  | 
 | ||
|  |         self.name = instantiate_name(original.name, self.instantiations) | ||
|  |         self.return_type = original.return_type | ||
|  |         self.args = original.args | ||
|  | 
 | ||
|  |         super().__init__(self.template, | ||
|  |                          self.name, | ||
|  |                          self.return_type, | ||
|  |                          self.args, | ||
|  |                          self.is_const, | ||
|  |                          parent=self.parent) | ||
|  | 
 | ||
|  |     @classmethod | ||
|  |     def construct(cls, original, typenames, class_instantiations, | ||
|  |                   method_instantiations, instantiated_args, parent): | ||
|  |         """Class method to construct object as required by InstantiationHelper.""" | ||
|  |         method = parser.Method( | ||
|  |             template=original.template, | ||
|  |             name=original.name, | ||
|  |             return_type=instantiate_return_type( | ||
|  |                 original.return_type, typenames, | ||
|  |                 class_instantiations + method_instantiations, | ||
|  |                 parent.cpp_typename()), | ||
|  |             args=parser.ArgumentList(instantiated_args), | ||
|  |             is_const=original.is_const, | ||
|  |             parent=parent, | ||
|  |         ) | ||
|  |         return InstantiatedMethod(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__()) | ||
|  | 
 | ||
|  | 
 | ||
|  | class InstantiatedStaticMethod(parser.StaticMethod): | ||
|  |     """
 | ||
|  |     Instantiate static method with template parameters. | ||
|  |     """
 | ||
|  |     def __init__(self, | ||
|  |                  original: parser.StaticMethod, | ||
|  |                  instantiations: Iterable[parser.Typename] = ()): | ||
|  |         self.original = original | ||
|  |         self.instantiations = instantiations | ||
|  | 
 | ||
|  |         self.name = instantiate_name(original.name, self.instantiations) | ||
|  |         self.return_type = original.return_type | ||
|  |         self.args = original.args | ||
|  |         self.template = original.template | ||
|  |         self.parent = original.parent | ||
|  | 
 | ||
|  |         super().__init__(self.name, self.return_type, self.args, self.template, | ||
|  |                          self.parent) | ||
|  | 
 | ||
|  |     @classmethod | ||
|  |     def construct(cls, original, typenames, class_instantiations, | ||
|  |                   method_instantiations, instantiated_args, parent): | ||
|  |         """Class method to construct object as required by InstantiationHelper.""" | ||
|  |         method = parser.StaticMethod( | ||
|  |             name=original.name, | ||
|  |             return_type=instantiate_return_type(original.return_type, | ||
|  |                                                 typenames, | ||
|  |                                                 class_instantiations + | ||
|  |                                                 method_instantiations, | ||
|  |                                                 parent.cpp_typename(), | ||
|  |                                                 instantiated_class=parent), | ||
|  |             args=parser.ArgumentList(instantiated_args), | ||
|  |             template=original.template, | ||
|  |             parent=parent, | ||
|  |         ) | ||
|  |         return InstantiatedStaticMethod(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__()) |