{% extends "config_template" %}

{% macro get_header_guard() %}
ROCPRIM_DEVICE_DETAIL_CONFIG_DEVICE_RADIX_SORT_HPP_
{%- endmacro %}

{% macro kernel_configuration(measurement) -%}
radix_sort_config<
    {{ measurement['long_radix_bits'] }},
    {{ measurement['short_radix_bits'] }},
    ::rocprim::kernel_config<{{ measurement['scan_block_size'] }}, {{ measurement['scan_items_per_thread'] }}>,
    ::rocprim::kernel_config<{{ measurement['sort_block_size'] }}, {{ measurement['sort_items_per_thread'] }}>,
    ::rocprim::kernel_config<{{ measurement['sort_single_block_size'] }}, {{ measurement['sort_single_items_per_thread'] }}>,
    ::rocprim::kernel_config<{{ measurement['sort_merge_block_size'] }}, {{ measurement['sort_merge_items_per_thread'] }}>,
    {{ measurement['merge_size_limit_blocks'] }},
    {{ measurement['force_single_kernel_config'] }},
    ::rocprim::kernel_config<{{ measurement['onesweep_histogram_block_size'] }}, {{ measurement['onesweep_histogram_items_per_thread'] }}>,
    ::rocprim::kernel_config<{{ measurement['onesweep_sort_block_size'] }}, {{ measurement['onesweep_sort_items_per_thread'] }}>,
    {{ measurement['onesweep_radix_bits'] }} > { };
{%- endmacro %}

{% macro general_case() -%}
template<unsigned int arch, class key_type, class value_type = rocprim::empty_type, class enable = void> struct default_radix_sort_config :
default_radix_sort_config_base<key_type, value_type> { };
{%- endmacro %}

{% macro configuration_arch_specific(benchmark_of_architecture, configuration) -%}
template<> struct default_radix_sort_config<static_cast<unsigned int>({{ benchmark_of_architecture.name }}), {{ configuration.key_type }}{{ ', '~configuration.value_type if configuration.value_type }}> :
{%- endmacro %}

{% macro configuration_fallback(benchmark_of_architecture, based_on_type, fallback_selection_criteria) -%}
// Based on {{ based_on_type }}
template<class key_type, class value_type> struct default_radix_sort_config<static_cast<unsigned int>({{ benchmark_of_architecture.name }}), key_type, value_type, {{ fallback_selection_criteria }}> :
{%- endmacro %}
