# # Copyright (C) 2020 Embedded AMS B.V. - All Rights Reserved # # This file is part of Embedded Proto. # # Embedded Proto is open source software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published # by the Free Software Foundation, version 3 of the license. # # Embedded Proto is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Embedded Proto. If not, see . # # For commercial and closed source application please visit: # . # # Embedded AMS B.V. # Info: # info at EmbeddedProto dot com # # Postal address: # Johan Huizingalaan 763a # 1066 VH, Amsterdam # the Netherlands # from .Field import Field class Oneof: def __init__(self, oneof_proto_descriptor, index, msg_descriptor, parent_msg): # A reference to the OneofDescriptorProto object which defines this field. self.descriptor = oneof_proto_descriptor # A reference to the parent message in which this oneof is defined. self.parent = parent_msg self.fields = [] # Loop over all the fields in this oneof for f in msg_descriptor.field: if f.HasField('oneof_index') and index == f.oneof_index: new_field = Field.factory(f, self.parent, oneof=self) self.fields.append(new_field) def get_name(self): return self.descriptor.name def get_variable_name(self): return self.get_name() + "_" def get_which_oneof(self): return "which_" + self.get_name() + "_" def get_fields(self): return self.fields def match_field_with_definitions(self, all_types_definitions): for field in self.fields: field.match_field_with_definitions(all_types_definitions) def register_template_parameters(self): all_parameters_registered = True for field in self.fields: all_parameters_registered = field.register_template_parameters() and all_parameters_registered return all_parameters_registered # Returns true if in oneof.init the new& function needs to be call to initialize already allocated memory. def oneof_allocation_required(self): result = False for field in self.fields: result = field.oneof_allocation_required() if result: break return result