libtransistor
A userland library for the Nintendo Switch
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
ipc.hpp
Go to the documentation of this file.
1 
6 #pragma once
7 
8 #include<libtransistor/cpp/types.hpp>
9 #include<libtransistor/ipc.h>
10 
11 #include<type_traits>
12 
13 namespace trn {
14 namespace ipc {
15 
16 class Message {
17  public:
18  ipc_message_t msg;
19 };
20 
21 template<typename T>
22 struct InObject {
23  InObject(T &ref) : value(&ref) { }
24  T *value;
25 };
26 
27 template<typename T>
28 struct OutObject {
29  OutObject(T &ref) : value(&ref) { }
30  T *value;
31 };
32 
33 template<typename T>
34 struct InRaw {
35  InRaw(T value) : value(value) { }
36  static_assert(std::is_pod<T>::value, "InRaw types must be POD");
37  T value;
38 
39  T &operator*() {
40  return value;
41  }
42 };
43 
44 template<typename T>
45 struct OutRaw {
46  OutRaw(T &ref) : value(&ref) { }
47  static_assert(std::is_pod<T>::value, "OutRaw types must be POD");
48 
49  OutRaw<T> &operator=(T val) {
50  *value = val;
51  return *this;
52  }
53 
54  T &operator*() {
55  return *value;
56  }
57 
58  T *value;
59 };
60 
61 struct copy {};
62 struct move {};
63 
64 template<typename T, typename Transfer>
65 struct InHandle {
66  InHandle(handle_t handle) : object(handle) {}
67 
68  InHandle<T, Transfer> &operator=(handle_t val) {
69  object = val;
70  return *this;
71  }
72 
73  T object;
74 };
75 
76 template<typename Transfer>
77 struct InHandle<handle_t, Transfer> {
78  InHandle(handle_t handle) : handle(handle) {}
79 
80  InHandle<handle_t, Transfer> &operator=(handle_t val) {
81  handle = val;
82  return *this;
83  }
84 
85  handle_t handle;
86 };
87 
88 template<typename T, typename Transfer, typename... Args>
89 struct OutHandle;
90 
91 template<typename Transfer>
92 struct OutHandle<handle_t, Transfer> {
93  OutHandle(handle_t &handle) : handle(&handle) {}
94 
95  OutHandle<handle_t, Transfer> &operator=(handle_t val) {
96  *handle = val;
97  return *this;
98  }
99 
100  handle_t *handle;
101 };
102 
103 template<typename T, typename Transfer, typename... Args>
104 struct OutHandle {
105  OutHandle(T &handle, Args... args) : handle(&handle), args(std::make_tuple(args...)) {}
106 
107  OutHandle<T, Transfer, Args...> &operator=(T &val) {
108  *handle = T(val.handle);
109  return *this;
110  }
111 
112  OutHandle<T, Transfer, Args...> &operator=(handle_t &val) {
113  HelpConstruct(val, std::index_sequence_for<Args...>());
114  return *this;
115  }
116 
117  T *handle;
118  std::tuple<Args...> args;
119  private:
120  template<std::size_t... I>
121  void HelpConstruct(handle_t &val, std::index_sequence<I...>) {
122  *handle = T(val, std::get<I>(args)...);
123  }
124 };
125 
126 template<typename T, uint32_t type, size_t expected_size = 0>
127 struct Buffer {
128  Buffer(std::vector<T> &vec) : Buffer(vec.data(), vec.size() * sizeof(T)) { }
129  Buffer(T *data, size_t size) : data(data), size(size) { }
130 
131  T *data;
132  size_t size;
133 };
134 
135 struct InPid {
136  uint64_t value;
137 };
138 
139 struct OutPid {
140  OutPid(uint64_t &ref) : value(&ref) { }
141  uint64_t *value;
142 };
143 
144 }
145 }
Describes an incoming IPC message. Used as an intermediate during unpacking.
Definition: ipc.h:234
Definition: ipc.hpp:45
Definition: ipc.hpp:139
Definition: ipc.hpp:28
Definition: ipc.hpp:16
Definition: ipc.hpp:62
uint32_t handle_t
Resource handle.
Definition: types.h:38
Definition: ipc.hpp:127
Definition: ipc.hpp:65
Definition: ipc.hpp:34
Interprocess Communication data structures and functions.
Definition: ipc.hpp:89
Definition: ipc.hpp:135
Definition: ipc.hpp:22
Definition: ipc.hpp:61