def generate_down_cast(output_file, cur_class, base_class, capi_generator): cur_class_extra_info = capi_generator.extra_info[cur_class] base_class_extra_info = capi_generator.extra_info[base_class] output_file.put_line('template<>') output_file.put_line( 'inline {return_type} down_cast(const {input_type}& input_object)'.format( return_type=cur_class_extra_info.get_class_name(), input_type=base_class_extra_info.get_class_name() ) ) with FileGenerator.IndentScope(output_file): Helpers.put_raw_pointer_structure(output_file) c_function_name = '{0}_cast_to_{1}'.format( base_class_extra_info.get_c_name(), cur_class_extra_info.get_c_name() ) output_file.put_line( 'return {0}({1}(reinterpret_cast<const raw_pointer_holder*>(&input_object)->raw_pointer), true);'.format( cur_class_extra_info.get_class_name(), c_function_name, ) ) c_function_declaration = 'void* {0}(void* object_pointer)'.format(c_function_name) capi_generator.loader_traits.add_c_function_declaration(c_function_declaration) with FileGenerator.IndentScope(capi_generator.output_source): capi_generator.output_source.put_line( 'return dynamic_cast<{0}*>(static_cast<{1}*>(object_pointer));'.format( cur_class.m_implementation_class_name, base_class.m_implementation_class_name ) ) capi_generator.output_source.put_line('') output_file.put_line('')
def put_raw_pointer_structure_if_required(self, output_file, arguments): if self.__is_raw_pointer_structure_required(arguments): Helpers.put_raw_pointer_structure(output_file)