Home | History | Annotate | Download | only in rpc
      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 
     11 namespace android {
     12 namespace pdx {
     13 namespace 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.
     17 template <int Opcode_, typename Signature_>
     18 struct 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.
     46 template <typename... MethodTypes>
     47 struct 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