GuillaumeDua / CppShelf

Collection of powerfuls - C++ Single-Header Libraries Files
https://guillaumedua.github.io/CppShelf/
MIT License
9 stars 1 forks source link

[mp] quick benchmark utility #171

Open GuillaumeDua opened 7 months ago

GuillaumeDua commented 7 months ago
namespace benchmark {

    template <template <std::size_t> typename, class> struct integral_trait_instancier;
    template <template <std::size_t> typename integral_trait, std::size_t ... N>
    struct integral_trait_instancier<integral_trait, std::index_sequence<N...>>
        : std::integral_constant<std::size_t, (integral_trait<N>::indexed::value + ...)>
    {};
}

Usage

template <typename ...> struct pack{};
struct A{}; struct B{}; struct C{};

template <std::size_t index>
struct bench_starts_with
{
    using indexed = std::integral_constant<std::size_t, index>;

    static_assert(starts_with_v<
        pack<A, B, C>,
        pack<A, B, C>
    >);

    static_assert(starts_with_v<
        pack<A, B, C, C>,
        pack<A, B, C>
    >);

    static_assert(not starts_with_v<
        pack<A, B, C>,
        pack<B, A, C>
    >);
};

using benchmarked = benchmark::integral_trait_instancier<
    bench_starts_with,
    std::make_index_sequence<50>
>::type;