xref: /openbmc/sdbusplus/include/sdbusplus/utility/make_dbus_args_tuple.hpp (revision e8f2b0d5a6e31b4efb9d8c6ffff2872562db4e74)
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...>)17 auto 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()23 constexpr 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)44 constexpr 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