1 #pragma once 2 3 #include <sdbusplus/message.hpp> 4 5 #include <cstddef> 6 #include <cstdint> 7 #include <tuple> 8 #include <utility> 9 10 namespace sdbusplus 11 { 12 namespace utility 13 { 14 namespace details 15 { 16 template <std::size_t FirstArgIndex, typename Tuple, std::size_t... Is> make_sub_tuple_impl(Tuple & t,std::index_sequence<Is...>)17auto make_sub_tuple_impl(Tuple& t, std::index_sequence<Is...>) 18 { 19 return std::tie(std::get<FirstArgIndex + Is>(t)...); 20 } 21 22 template <typename TupleType> args_to_skip()23constexpr size_t args_to_skip() 24 { 25 constexpr std::size_t input_size = std::tuple_size_v<TupleType>; 26 if constexpr (input_size > 1) 27 { 28 if (std::is_same_v<std::tuple_element_t<1, TupleType>, 29 sdbusplus::message_t>) 30 { 31 return 2; 32 } 33 } 34 return 1; 35 } 36 37 } // namespace details 38 39 /* 40 * Given a tuple of function args to a method callback, return a tuple 41 * with references to only the dbus message arguments. 42 * */ 43 template <typename... Args> make_dbus_args_tuple(std::tuple<Args...> & t)44constexpr auto make_dbus_args_tuple(std::tuple<Args...>& t) 45 { 46 using tuple_type = std::remove_reference_t<decltype(t)>; 47 constexpr std::size_t input_size = std::tuple_size_v<tuple_type>; 48 constexpr size_t skip_args = details::args_to_skip<tuple_type>(); 49 constexpr std::size_t new_size = input_size - skip_args; 50 std::index_sequence seq = std::make_index_sequence<new_size>{}; 51 return details::make_sub_tuple_impl<skip_args>(t, seq); 52 } 53 } // namespace utility 54 } // namespace sdbusplus 55