<commit_before>#include <type_traits>

template <typename... Ts>
struct type_list
{
    static const size_t numberOfTypes = sizeof...(Ts);
};

template <typename, typename>
struct push;

template <typename T, typename... Ts>
struct push<T, type_list<Ts...>>
{
    using type = type_list<Ts..., T>;
};

template <typename>
struct pop;

template <>
struct pop<type_list<>>
{
    using type = type_list<>;
};

template <typename T, typename... Ts>
struct pop<type_list<T, Ts...>>
{
    using type = type_list<Ts...>;
};

template <typename, typename>
struct is_first_type
{
    static const bool value = false;
};


template <typename T, typename T_head, typename... Ts>
struct is_first_type<T, type_list<T_head, Ts...>>
{
    static const bool value = std::is_same<T, T_head>::value;
};


template <typename T, typename type_list, bool is_first = is_first_type<T, type_list>::value >
struct has_type
{
    static const bool value = true;
};

template <typename T, typename T_head, typename... Ts>
struct has_type<T, type_list<T_head, Ts...>, false>
{
    static const bool value = has_type<T, type_list<Ts...>>::value;
};<commit_msg>optimize judge first type in list<commit_after>#include <type_traits>

template <typename... Ts>
struct type_list
{
    static const size_t numberOfTypes = sizeof...(Ts);
};

template <typename, typename>
struct push;

template <typename T, typename... Ts>
struct push<T, type_list<Ts...>>
{
    using type = type_list<Ts..., T>;
};

template <typename>
struct pop;

template <>
struct pop<type_list<>>
{
    using type = type_list<>;
};

template <typename T, typename... Ts>
struct pop<type_list<T, Ts...>>
{
    using type = type_list<Ts...>;
};

template <typename, typename>
struct is_first_type
{
    static const bool value = false;
};


template <typename T, typename... Ts>
struct is_first_type<T, type_list<T, Ts...>>
{
    static const bool value = true;
};


template <typename T, typename type_list, bool is_first = is_first_type<T, type_list>::value >
struct has_type
{
    static const bool value = true;
};

template <typename T, typename T_head, typename... Ts>
struct has_type<T, type_list<T_head, Ts...>, false>
{
    static const bool value = has_type<T, type_list<Ts...>>::value;
};
{'fraction_non_alphanumeric': 0.1512981199641898, 'fraction_numerical': 0.0, 'mean_word_length': 4.045146726862303, 'pattern_counts': {'":': 0, '<': 58, '<?xml version=': 0, '>': 58, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5730402', 'n_tokens_mistral': 785, 'n_tokens_neox': 749, 'n_words': 224}