Home | History | Annotate | Download | only in rpc
      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 
      8 namespace android {
      9 namespace pdx {
     10 namespace 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)>;
     16 template <typename T>
     17 using 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.
     23 template <typename T>
     24 struct FunctionTraits;
     25 
     26 template <typename Return_, typename... Args_>
     27 struct 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