def register_backend_select_methods(declarations, template_path, file_manager):
    backend_select_method_definitions = []
    backend_select_function_registrations = []

    for decl in declarations:
        for option in decl["options"]:
            if needs_backend_select(option):
                name = option['name']
                op_name_with_overload_name = option['name']
                if option.get('overload_name', '') != '':
                    name = "{0}_{1}".format(name, option['overload_name'])
                    op_name_with_overload_name = "{0}.{1}".format(
                        op_name_with_overload_name, option['overload_name'])

                if option['use_c10_dispatcher'] == 'full':
                    func_reg = FUNCTION_REGISTRATION.substitute(
                        schema_string=option['schema_string'],
                        op_name_with_overload_name=op_name_with_overload_name,
                        function_name=name)
                else:
                    assert option[
                        'use_c10_dispatcher'] == 'with_codegenerated_unboxing_wrapper'
                    func_reg = UNBOXEDONLY_FUNCTION_REGISTRATION.substitute(
                        schema_string=option['schema_string'],
                        op_name_with_overload_name=op_name_with_overload_name,
                        function_name=name)

                dispatch_key_init = gen_dispatch_key_init(
                    '_dk', option['formals_list'])

                # See NOTE[UnboxedOnly] in function_wrapper.py
                if option['use_c10_dispatcher'] == 'full':
                    function_cpp_signature = option[
                        'schema_order_cpp_signature']
                    function_actuals = option['schema_order_actuals']
                else:
                    assert option[
                        'use_c10_dispatcher'] == 'with_codegenerated_unboxing_wrapper'
                    function_cpp_signature = option['cpp_signature']
                    function_actuals = option['actuals']
                method_def = FUNCTION_DEFINITION.substitute(
                    function_name=name,
                    schema_string=option['schema_string'],
                    method_formals=option['formals_with_defaults'],
                    name=option['name'],
                    overload_name=option['overload_name'],
                    dispatch_key_init=dispatch_key_init,
                    function_cpp_signature=function_cpp_signature,
                    function_actuals=function_actuals)

                backend_select_function_registrations.append(func_reg)
                backend_select_method_definitions.append(method_def)

    env = {}
    env['backend_select_method_definitions'] = backend_select_method_definitions
    env['backend_select_function_registrations'] = backend_select_function_registrations

    env['generated_comment'] = GENERATED_COMMENT.substitute(
        filename=template_path)
    file_manager.write('BackendSelectRegister.cpp', template_path, env)
def register_backend_select_methods(declarations, template_path, file_manager):
    backend_select_method_definitions = []
    backend_select_function_registrations = []

    for decl in declarations:
        for option in decl["options"]:
            if needs_backend_select(option):
                assert option['use_c10_dispatcher'] in [
                    'unboxed_only', 'with_codegenerated_unboxing_wrapper'
                ]

                name = option['name']
                if option.get('overload_name', '') != '':
                    name = "{0}_{1}".format(name, option['overload_name'])

                func_reg = FUNCTION_REGISTRATION.substitute(
                    schema_string=option['schema_string'], function_name=name)

                dispatch_key_init = gen_dispatch_key_init(
                    '_dk', option['formals_list'])

                method_def = FUNCTION_DEFINITION.substitute(
                    function_name=name,
                    schema_string=option['schema_string'],
                    method_formals=option['formals_with_defaults'],
                    name=option['name'],
                    overload_name=option['overload_name'],
                    dispatch_key_init=dispatch_key_init,
                    formals_types=option['formals_types_with_return'],
                    type_method_actuals=option['type_method_actuals'])

                backend_select_function_registrations.append(func_reg)
                backend_select_method_definitions.append(method_def)

    env = {}
    env['backend_select_method_definitions'] = backend_select_method_definitions
    env['backend_select_function_registrations'] = backend_select_function_registrations

    env['generated_comment'] = GENERATED_COMMENT.substitute(
        filename=template_path)
    file_manager.write('BackendSelectRegister.cpp', template_path, env)