diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-04-26 14:17:19 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-04-28 08:26:44 -0600 |
| commit | 2c9664ec83161cffa0001f1b90a4a377822a399b (patch) | |
| tree | 81d29513dc8abc9ac7d425dcea75ad711947297f | |
| parent | 9071bb96976a02fd9e321abb308fffcd62e905dd (diff) | |
| download | usermoji-2c9664ec83161cffa0001f1b90a4a377822a399b.tar.xz | |
layers: Add copy constructors and initializers for safe_* structs
Any safe struct for which default copy constructor was incorrect was
broken (anything with embedded ptrs). This change fixes that by adding
correct copy constructors. Also had to add initializers that can take
object ptrs in order for copy constructor code to work.
| -rwxr-xr-x | vk_helper.py | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/vk_helper.py b/vk_helper.py index a4e79488..fc99b1cc 100755 --- a/vk_helper.py +++ b/vk_helper.py @@ -1599,9 +1599,11 @@ class StructWrapperGen: else: ss_decls.append(" %s %s;" % (m_type, self.struct_dict[s][m]['name'])) ss_decls.append(" %s(const %s* pInStruct);" % (ss_name, s)) - ss_decls.append(" %s();" % (ss_name)) + ss_decls.append(" %s(const %s& src);" % (ss_name, ss_name)) # Copy constructor + ss_decls.append(" %s();" % (ss_name)) # Default constructor ss_decls.append(" ~%s();" % (ss_name)) ss_decls.append(" void initialize(const %s* pInStruct);" % (s)) + ss_decls.append(" void initialize(const %s* src);" % (ss_name)) ss_decls.append(" %s *ptr() { return reinterpret_cast<%s *>(this); }" % (s, s)) ss_decls.append(" %s const *ptr() const { return reinterpret_cast<%s const *>(this); }" % (s, s)) ss_decls.append("};") @@ -1732,8 +1734,18 @@ class StructWrapperGen: construct_txt = custom_construct_txt[s] ss_src.append("\n%s::%s(const %s* pInStruct) : %s\n{\n%s}" % (ss_name, ss_name, s, init_list, construct_txt)) ss_src.append("\n%s::%s() {}" % (ss_name, ss_name)) + # Create slight variation of init and construct txt for copy constructor that takes a src object reference vs. struct ptr + copy_construct_init = init_func_txt.replace('pInStruct->', 'src.') + copy_construct_txt = construct_txt.replace(' (pInStruct->', ' (src.') # Exclude 'if' blocks from next line + copy_construct_txt = copy_construct_txt.replace('(pInStruct->', '(*src.') # Pass object to copy constructors + copy_construct_txt = copy_construct_txt.replace('pInStruct->', 'src.') # Modify remaining struct refs for src object + ss_src.append("\n%s::%s(const %s& src)\n{\n%s%s}" % (ss_name, ss_name, ss_name, copy_construct_init, copy_construct_txt)) # Copy constructor ss_src.append("\n%s::~%s()\n{\n%s}" % (ss_name, ss_name, destruct_txt)) ss_src.append("\nvoid %s::initialize(const %s* pInStruct)\n{\n%s%s}" % (ss_name, s, init_func_txt, construct_txt)) + # Copy initializer uses same txt as copy constructor but has a ptr and not a reference + init_copy = copy_construct_init.replace('src.', 'src->') + init_construct = copy_construct_txt.replace('src.', 'src->') + ss_src.append("\nvoid %s::initialize(const %s* src)\n{\n%s%s}" % (ss_name, ss_name, init_copy, init_construct)) if s in ifdef_dict: ss_src.append('#endif') return "\n".join(ss_src) |
