1#ifndef ANDROID_PDX_RPC_FUNCTION_TRAITS_H_ 2#define ANDROID_PDX_RPC_FUNCTION_TRAITS_H_ 3 4#include <type_traits> 5 6#include <pdx/rpc/type_operators.h> 7 8namespace android { 9namespace pdx { 10namespace rpc { 11 12// Utility type to capture return and argument types of a function signature. 13// Examples: 14// typedef SignatureType<int(int)> SignatureType; 15// using SignatureType = SignatureType<int(int)>; 16template <typename T> 17using SignatureType = T; 18 19// Utility class to extract return and argument types from function types. 20// Provides nested types for return value, arguments, and full signature. Also 21// provides accessor types for individual arguments, argument-arity, and type 22// substitution. 23template <typename T> 24struct FunctionTraits; 25 26template <typename Return_, typename... Args_> 27struct FunctionTraits<Return_(Args_...)> { 28 using Return = Return_; 29 using Args = std::tuple<Args_...>; 30 using Signature = SignatureType<Return_(Args_...)>; 31 32 enum : std::size_t { Arity = sizeof...(Args_) }; 33 34 template <std::size_t Index> 35 using Arg = typename std::tuple_element<Index, Args>::type; 36 37 template <typename... Params> 38 using RewriteArgs = 39 SignatureType<Return_(ConditionalRewrite<Args_, Params>...)>; 40 41 template <typename ReturnType, typename... Params> 42 using RewriteSignature = 43 SignatureType<ConditionalRewrite<Return_, ReturnType>( 44 ConditionalRewrite<Args_, Params>...)>; 45 46 template <template <typename> class Wrapper, typename ReturnType, 47 typename... Params> 48 using RewriteSignatureWrapReturn = 49 SignatureType<Wrapper<ConditionalRewrite<Return_, ReturnType>>( 50 ConditionalRewrite<Args_, Params>...)>; 51 52 template <typename ReturnType> 53 using RewriteReturn = 54 SignatureType<ConditionalRewrite<Return_, ReturnType>(Args_...)>; 55}; 56 57} // namespace rpc 58} // namespace pdx 59} // namespace android 60 61#endif // ANDROID_PDX_RPC_FUNCTION_TRAITS_H_ 62