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