From 5e9d78552ad49b0a3f1aad4520a09d64afd57f19 Mon Sep 17 00:00:00 2001 From: John Zulauf Date: Tue, 23 Jan 2018 11:20:50 -0700 Subject: layer: Add utility template for sType init Add utility function to auto populate sType field based on typename given to autogen of typemap helper. Return value optimization (copy elision) should make this perfomance neutral vs. inline init. Change-Id: I231cf92d5063c19f9ad5b14189dd162fdac76a43 --- scripts/helper_file_generator.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'scripts') diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py index 114f47f8..f47857a8 100644 --- a/scripts/helper_file_generator.py +++ b/scripts/helper_file_generator.py @@ -1103,6 +1103,7 @@ class HelperFileOutputGenerator(OutputGenerator): typename_func = fprefix + 'typename' idname_func = fprefix + 'stype_name' find_func = fprefix + 'find_in_chain' + init_func = fprefix + 'init_struct' explanatory_comment = '\n'.join(( '// These empty generic templates are specialized for each type with sType', @@ -1142,22 +1143,35 @@ class HelperFileOutputGenerator(OutputGenerator): ' }}', ' return found;', '}}', + '', + '// Init the header of an sType struct with pNext', + 'template T {init_func}(void *p_next) {{', + ' T out = {{}};', + ' out.sType = {type_map}::kSType;', + ' out.pNext = p_next;', + ' return out;', + '}}', + '', + '// Init the header of an sType struct', + 'template T {init_func}() {{', + ' T out = {{}};', + ' out.sType = {type_map}::kSType;', + ' return out;', + '}}', + '')) code = [] + + # Generate header code.append('\n'.join(( '#pragma once', '#include \n', explanatory_comment, '', empty_idmap, - empty_typemap, '', - utilities_format.format(id_member=id_member, id_map=idmap, type_map=typemap, - type_member=type_member, header=generic_header, typename_func=typename_func, idname_func=idname_func, - find_func=find_func), '' - ))) + empty_typemap, ''))) # Generate the specializations for each type and stype - for item in self.structMembers: typename = item.name info = self.structTypes.get(typename) @@ -1175,6 +1189,13 @@ class HelperFileOutputGenerator(OutputGenerator): if item.ifdef_protect != None: code.append('#endif // %s' % item.ifdef_protect) + # Generate utilities for all types + code.append('\n'.join(( + utilities_format.format(id_member=id_member, id_map=idmap, type_map=typemap, + type_member=type_member, header=generic_header, typename_func=typename_func, idname_func=idname_func, + find_func=find_func, init_func=init_func), '' + ))) + return "\n".join(code) # -- cgit v1.2.3