#ifndef REST_RPC_META_UTIL_HPP #define REST_RPC_META_UTIL_HPP #include "cplusplus_14.h" namespace rest_rpc{ template void for_each(const std::tuple& t, Func&& f, std::index_sequence) { (void)std::initializer_list { (f(std::get(t)), void(), 0)...}; } template void for_each_i(const std::tuple& t, Func&& f, std::index_sequence) { (void)std::initializer_list { (f(std::get(t), std::integral_constant{}), void(), 0)...}; } template struct function_traits; template struct function_traits { public: enum { arity = sizeof...(Args)+1 }; typedef Ret function_type(Arg, Args...); typedef Ret return_type; using stl_function_type = std::function; typedef Ret(*pointer)(Arg, Args...); typedef std::tuple tuple_type; typedef std::tuple>, std::remove_const_t>...> bare_tuple_type; using args_tuple = std::tuple>...>; using args_tuple_2nd = std::tuple>...>; }; template struct function_traits { public: enum { arity = 0 }; typedef Ret function_type(); typedef Ret return_type; using stl_function_type = std::function; typedef Ret(*pointer)(); typedef std::tuple<> tuple_type; typedef std::tuple<> bare_tuple_type; using args_tuple = std::tuple; using args_tuple_2nd = std::tuple; }; template struct function_traits : function_traits{}; template struct function_traits> : function_traits{}; template struct function_traits : function_traits{}; template struct function_traits : function_traits{}; template struct function_traits : function_traits{}; template using remove_const_reference_t = std::remove_const_t>; template auto make_tuple_from_sequence(std::index_sequence)->decltype(std::make_tuple(Is...)) { std::make_tuple(Is...); } template constexpr auto make_tuple_from_sequence()->decltype(make_tuple_from_sequence(std::make_index_sequence{})) { return make_tuple_from_sequence(std::make_index_sequence{}); } namespace detail { template void tuple_switch(const std::size_t i, Tuple&& t, F&& f, std::index_sequence) { (void)std::initializer_list { (i == Is && ( (void)std::forward(f)(std::integral_constant{}), 0))... }; } } // namespace detail template inline void tuple_switch(const std::size_t i, Tuple&& t, F&& f) { constexpr auto N = std::tuple_size>::value; detail::tuple_switch(i, std::forward(t), std::forward(f), std::make_index_sequence{}); } template using nth_type_of = std::tuple_element_t>; template using last_type_of = nth_type_of; } #endif //REST_RPC_META_UTIL_HPP