/
auto_arg.h
295 lines (239 loc) · 6.75 KB
/
auto_arg.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
// Copyright (C) 2012-2014 Leap Motion, Inc. All rights reserved.
#pragma once
#include "auto_in.h"
#include "auto_out.h"
#include "optional_ptr.h"
/*
The auto_arg<T> classes are used to generate of auto_in and auto_out types
based on the argument type.
The core functionality is that all argument types are treated as standard
types, and can be re-derived from those standard types.
It is expected that every parent of auto_arg will define:
- id_type (an unqualified type)
- base_type (a type qualified by const and/or &)
- shared_type (the pointer type from which the parent inherits)
Furthermore, by classifying arguments in terms of orientation and fundamental
type, auto_arg enables the specification of a principal type to any class
implementing an AutoFilter method.
*/
/// <summary>
/// Reinterpret copied argument as input
/// </summary>
template<class type>
class auto_arg:
public auto_in<type>
{
public:
typedef auto_in<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_in<type>(packet, source)
{}
static const bool is_shared = false;
static const bool is_optional = false;
};
/// <summary>
/// Reinterpret copied argument as input
/// </summary>
template<class type>
class auto_arg<const type>:
public auto_in<type>
{
public:
typedef auto_in<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_in<type>(packet, source)
{}
static const bool is_shared = false;
static const bool is_optional = false;
};
/// <summary>
/// Specialization for "const T&" ~ auto_in<T>
/// </summary>
template<class type>
class auto_arg<const type&>:
public auto_in<type>
{
public:
typedef auto_in<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_in<type>(packet, source)
{}
static const bool is_shared = false;
static const bool is_optional = false;
};
/// <summary>
/// Specialization for "std::shared_ptr<const T>" ~ auto_in<T>
/// </summary>
template<class type>
class auto_arg<std::shared_ptr<const type>>:
public auto_in<type>
{
public:
typedef auto_in<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_in<type>(packet, source)
{}
static const bool is_shared = true;
static const bool is_optional = false;
};
/// <summary>
/// Specialization for equivalent type auto_in<T>
/// </summary>
template<class type>
class auto_arg<auto_in<type>>:
public auto_in<type>
{
public:
typedef auto_in<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_in<type>(packet, source)
{}
static const bool is_shared = true;
static const bool is_optional = false;
};
/// <summary>
/// Specialization for "T&" ~ auto_in<T>
/// </summary>
template<class type>
class auto_arg<type&>:
public auto_out<type>
{
public:
typedef auto_out<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_out<type>(packet, source)
{}
static const bool is_shared = false;
static const bool is_optional = false;
};
/// <summary>
/// Specialization for "std::shared_ptr<T>" ~ auto_out<T>
/// </summary>
template<class type>
class auto_arg<std::shared_ptr<type>>:
public auto_out<type>
{
public:
typedef auto_out<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_out<type>(packet, source)
{}
static const bool is_shared = true;
static const bool is_optional = false;
};
/// <summary>
/// Specialization for equivalent type auto_out<T>
/// </summary>
template<class type>
class auto_arg<auto_out<type>>:
public auto_out<type>
{
public:
typedef auto_out<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
auto_out<type>(packet, source)
{}
static const bool is_shared = true;
static const bool is_optional = true;
};
/// <summary>
/// Specialization for equivalent type optional_ptr<T>
/// </summary>
template<class type>
class auto_arg<optional_ptr<type>>:
public optional_ptr<type>
{
public:
typedef optional_ptr<type> auto_type;
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
optional_ptr<type>(packet, source)
{}
static const bool is_shared = true;
static const bool is_optional = true;
};
/// <summary>
/// Specialization for first-call "AutoPacket&"
/// </summary>
template<>
class auto_arg<AutoPacket&>
{
protected:
/// Sigil to distinguish AutoPacket&
class first_call_sigil {
public:
first_call_sigil(void);
virtual ~first_call_sigil(void);
};
std::shared_ptr<AutoPacket> m_packet;
public:
typedef AutoPacket& auto_type;
typedef first_call_sigil id_type;
typedef AutoPacket& base_type;
typedef std::shared_ptr<AutoPacket> shared_type;
// Although AutoPacket& enable both inputs and outputs
// its availability is handled as an input.
static const bool is_input = true;
static const bool is_output = false;
operator base_type () const {
return *m_packet;
}
operator shared_type () {
return m_packet;
}
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
m_packet(packet)
{}
static const bool is_shared = false;
static const bool is_optional = false;
};
/// <summary>
/// Specialization for final-call "const AutoPacket&"
/// </summary>
/// <remarks>
/// This is called during Finalize, so the shared_ptr may
/// be invalidated if the associated ObjectPool is cleared.
/// Therefore it is essential that this cannot be used with
/// deferred calls.
/// </remarks>
template<>
class auto_arg<const AutoPacket&>
{
protected:
/// Sigil to distinguish const AutoPacket&
class final_call_sigil {
public:
final_call_sigil(void);
virtual ~final_call_sigil(void);
};
std::shared_ptr<AutoPacket> m_packet;
public:
typedef const AutoPacket& auto_type;
typedef final_call_sigil id_type;
typedef const AutoPacket& base_type;
typedef std::weak_ptr<const AutoPacket> shared_type;
// const AutoPacket& can only be used to observe data
static const bool is_input = true;
static const bool is_output = false;
operator base_type () const {
return *m_packet;
}
operator shared_type () {
return m_packet;
}
auto_arg() {}
auto_arg(std::shared_ptr<AutoPacket> packet, const std::type_info& source = typeid(void)):
m_packet(packet)
{}
static const bool is_shared = false;
static const bool is_optional = false;
};