47 lines
1.2 KiB
C
47 lines
1.2 KiB
C
|
#ifndef __PLASP_APP__UTILS_H
|
||
|
#define __PLASP_APP__UTILS_H
|
||
|
|
||
|
#include <cxxopts.hpp>
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Command
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
template <std::size_t... Index>
|
||
|
auto makeIndexDispatcher(std::index_sequence<Index...>)
|
||
|
{
|
||
|
return
|
||
|
[](auto &&f)
|
||
|
{
|
||
|
(f(std::integral_constant<std::size_t, Index>{}), ...);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
template <std::size_t N>
|
||
|
auto makeIndexDispatcher()
|
||
|
{
|
||
|
return makeIndexDispatcher(std::make_index_sequence<N>{});
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
template <typename Tuple, typename Functor>
|
||
|
void forEach(Tuple &&tuple, Functor &&functor)
|
||
|
{
|
||
|
constexpr auto n = std::tuple_size<std::decay_t<Tuple>>::value;
|
||
|
auto dispatcher = makeIndexDispatcher<n>();
|
||
|
dispatcher(
|
||
|
[&functor, &tuple](auto index)
|
||
|
{
|
||
|
functor(std::get<index>(std::forward<Tuple>(tuple)));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#endif
|