1#ifndef ANDROID_PDX_RPC_REMOTE_METHOD_TYPE_H_ 2#define ANDROID_PDX_RPC_REMOTE_METHOD_TYPE_H_ 3 4#include <cstddef> 5#include <tuple> 6#include <type_traits> 7 8#include <pdx/rpc/enumeration.h> 9#include <pdx/rpc/function_traits.h> 10 11namespace android { 12namespace pdx { 13namespace rpc { 14 15// Utility class binding a remote method opcode to its function signature. 16// Describes the interface between RPC clients and services for a single method. 17template <int Opcode_, typename Signature_> 18struct RemoteMethodType { 19 typedef FunctionTraits<Signature_> Traits; 20 21 enum : int { Opcode = Opcode_ }; 22 23 typedef typename Traits::Signature Signature; 24 typedef typename Traits::Return Return; 25 typedef typename Traits::Args Args; 26 27 template <typename... Params> 28 using RewriteArgs = typename Traits::template RewriteArgs<Params...>; 29 30 template <typename ReturnType, typename... Params> 31 using RewriteSignature = 32 typename Traits::template RewriteSignature<ReturnType, Params...>; 33 34 template <template <typename> class Wrapper, typename ReturnType, 35 typename... Params> 36 using RewriteSignatureWrapReturn = 37 typename Traits::template RewriteSignatureWrapReturn<Wrapper, ReturnType, 38 Params...>; 39 40 template <typename ReturnType> 41 using RewriteReturn = typename Traits::template RewriteReturn<ReturnType>; 42}; 43 44// Utility class representing a set of related RemoteMethodTypes. Describes the 45// interface between RPC clients and services as a set of methods. 46template <typename... MethodTypes> 47struct RemoteAPI { 48 typedef std::tuple<MethodTypes...> Methods; 49 enum : std::size_t { Length = sizeof...(MethodTypes) }; 50 51 template <std::size_t Index> 52 using Method = typename std::tuple_element<Index, Methods>::type; 53 54 template <typename MethodType> 55 static constexpr std::size_t MethodIndex() { 56 return ElementForType<MethodType, MethodTypes...>::Index; 57 } 58}; 59 60// Macro to simplify defining remote method signatures. Remote method signatures 61// are specified by defining a RemoteMethodType for each remote method. 62#define PDX_REMOTE_METHOD(name, opcode, ... /*signature*/) \ 63 using name = ::android::pdx::rpc::RemoteMethodType<opcode, __VA_ARGS__> 64 65// Macro to simplify defining a set of remote method signatures. 66#define PDX_REMOTE_API(name, ... /*methods*/) \ 67 using name = ::android::pdx::rpc::RemoteAPI<__VA_ARGS__> 68 69} // namespace rpc 70} // namespace pdx 71} // namespace android 72 73#endif // ANDROID_PDX_RPC_REMOTE_METHOD_TYPE_H_ 74