From 3c9371589d19cb8618ec9aef6d8de5d83450386c Mon Sep 17 00:00:00 2001 From: Stefan Biereigel Date: Thu, 30 Jan 2020 21:26:37 +0100 Subject: add inheritance for pywrap generators --- misc/py_wrap_generator.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'misc/py_wrap_generator.py') diff --git a/misc/py_wrap_generator.py b/misc/py_wrap_generator.py index 9b4e644c0..c60a1f268 100644 --- a/misc/py_wrap_generator.py +++ b/misc/py_wrap_generator.py @@ -721,6 +721,7 @@ class WClass: name = None namespace = None link_type = None + base_class = None id_ = None string_id = None hash_id = None @@ -732,6 +733,7 @@ class WClass: def __init__(self, name, link_type, id_, string_id = None, hash_id = None, needs_clone = False): self.name = name self.namespace = None + self.base_class = None self.link_type = link_type self.id_ = id_ self.string_id = string_id @@ -1971,9 +1973,21 @@ def parse_header(source): for namespace in impl_namespaces: complete_namespace += "::" + namespace debug("\tFound " + struct_name + " in " + complete_namespace,2) + + base_class_name = None + if len(ugly_line.split(" : ")) > 1: # class is derived + deriv_str = ugly_line.split(" : ")[1] + if len(deriv_str.split("::")) > 1: # namespace of base class is given + base_class_name = deriv_str.split("::", 1)[1] + else: + base_class_name = deriv_str.split(" ")[0] + debug("\t " + struct_name + " is derived from " + base_class_name,2) + base_class = class_by_name(base_class_name) + class_ = (class_by_name(struct_name), ugly_line.count("{"))#calc_ident(line)) if struct_name in classnames: class_[0].namespace = complete_namespace + class_[0].base_class = base_class i += 1 continue @@ -2142,6 +2156,21 @@ def expand_functions(): new_funs.extend(expand_function(fun)) class_.found_funs = new_funs +def inherit_members(): + for source in sources: + for class_ in source.classes: + if class_.base_class: + base_funs = copy.deepcopy(class_.base_class.found_funs) + for fun in base_funs: + fun.member_of = class_ + fun.namespace = class_.namespace + base_vars = copy.deepcopy(class_.base_class.found_vars) + for var in base_vars: + var.member_of = class_ + var.namespace = class_.namespace + class_.found_funs.extend(base_funs) + class_.found_vars.extend(base_vars) + def clean_duplicates(): for source in sources: for class_ in source.classes: @@ -2178,6 +2207,7 @@ def gen_wrappers(filename, debug_level_ = 0): parse_header(source) expand_functions() + inherit_members() clean_duplicates() import shutil -- cgit v1.2.3 From 362e3aa40fe4137e8658100d80808ff9ca221ef8 Mon Sep 17 00:00:00 2001 From: Stefan Biereigel Date: Mon, 3 Feb 2020 20:21:02 +0100 Subject: expose polymorphism through python wrappers --- misc/py_wrap_generator.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'misc/py_wrap_generator.py') diff --git a/misc/py_wrap_generator.py b/misc/py_wrap_generator.py index c60a1f268..d5bbecf00 100644 --- a/misc/py_wrap_generator.py +++ b/misc/py_wrap_generator.py @@ -806,6 +806,8 @@ class WClass: for con in self.found_constrs: text += con.gen_decl() + if self.base_class is not None: + text += "\n\t\tvirtual ~" + self.name + "() { };" for var in self.found_vars: text += var.gen_decl() for fun in self.found_funs: @@ -910,15 +912,19 @@ class WClass: def gen_boost_py(self): body = self.gen_boost_py_body() + base_info = "" + if self.base_class is not None: + base_info = ", bases<%s::%s>" % (self.base_class.namespace, self.base_class.name) + if self.link_type == link_types.derive: - text = "\n\t\tclass_<" + self.name + ">(\"Cpp" + self.name + "\"" + text = "\n\t\tclass_<" + self.name + base_info + ">(\"Cpp" + self.name + "\"" text += body text += "\n\t\tclass_<" + self.name text += "Wrap, boost::noncopyable" text += ">(\"" + self.name + "\"" text += body else: - text = "\n\t\tclass_<" + self.name + ">(\"" + self.name + "\"" + text = "\n\t\tclass_<" + self.name + base_info + ">(\"" + self.name + "\"" text += body return text -- cgit v1.2.3 From 3d13b1085964c090972765d10cfef41b61d1a13e Mon Sep 17 00:00:00 2001 From: Stefan Biereigel Date: Mon, 3 Feb 2020 20:54:32 +0100 Subject: remove namespace mention from inheritance information --- misc/py_wrap_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'misc/py_wrap_generator.py') diff --git a/misc/py_wrap_generator.py b/misc/py_wrap_generator.py index d5bbecf00..fac5b48a4 100644 --- a/misc/py_wrap_generator.py +++ b/misc/py_wrap_generator.py @@ -914,7 +914,7 @@ class WClass: body = self.gen_boost_py_body() base_info = "" if self.base_class is not None: - base_info = ", bases<%s::%s>" % (self.base_class.namespace, self.base_class.name) + base_info = ", bases<" + (self.base_class.name) + ">" if self.link_type == link_types.derive: text = "\n\t\tclass_<" + self.name + base_info + ">(\"Cpp" + self.name + "\"" -- cgit v1.2.3