Embedded Template Library
1.0
Loading...
Searching...
No Matches
visitor.h
Go to the documentation of this file.
1
2
3
/******************************************************************************
4
The MIT License(MIT)
5
6
Embedded Template Library.
7
https://github.com/ETLCPP/etl
8
https://www.etlcpp.com
9
10
Copyright(c) 2014 John Wellbelove
11
12
Permission is hereby granted, free of charge, to any person obtaining a copy
13
of this software and associated documentation files(the "Software"), to deal
14
in the Software without restriction, including without limitation the rights
15
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16
copies of the Software, and to permit persons to whom the Software is
17
furnished to do so, subject to the following conditions :
18
19
The above copyright notice and this permission notice shall be included in all
20
copies or substantial portions of the Software.
21
22
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
SOFTWARE.
29
******************************************************************************/
30
31
#ifndef ETL_VISITOR_INCLUDED
32
#define ETL_VISITOR_INCLUDED
33
34
#include "
platform.h
"
35
#include "
type_traits.h
"
36
37
//*****************************************************************************
50
//*****************************************************************************
51
52
namespace
etl
53
{
54
#if ETL_USING_CPP11 && !defined(ETL_VISITOR_FORCE_CPP03_IMPLEMENTATION)
55
56
//*****************************************************************
59
//*****************************************************************
60
template
<
typename
T1,
typename
... Types>
61
class
visitable
:
public
visitable
<T1>,
public
visitable
<Types...>
62
{
63
public
:
64
65
using
visitable<T1>::accept;
66
using
visitable<Types...>::accept;
67
};
68
69
//*****************************************************************
72
//*****************************************************************
73
template
<
typename
T1>
74
class
visitable
<T1>
75
{
76
public
:
77
78
virtual
~visitable() =
default
;
79
80
virtual
void
accept(T1&) = 0;
81
};
82
83
#else
84
85
//*****************************************************************
89
//*****************************************************************
90
template
<
typename
T1,
typename
T2 =
void
,
typename
T3 =
void
,
typename
T4 =
void
>
91
class
visitable
92
{
93
public
:
94
95
virtual
~visitable
() {}
96
97
virtual
void
accept(T1&) = 0;
98
virtual
void
accept(T2&) = 0;
99
virtual
void
accept(T3&) = 0;
100
virtual
void
accept(T4&) = 0;
101
};
102
103
//*****************************************************************
107
//*****************************************************************
108
template
<
typename
T1,
typename
T2,
typename
T3>
109
class
visitable
<T1, T2, T3>
110
{
111
public
:
112
113
virtual
~visitable
() {}
114
115
virtual
void
accept(T1&) = 0;
116
virtual
void
accept(T2&) = 0;
117
virtual
void
accept(T3&) = 0;
118
};
119
120
//*****************************************************************
124
//*****************************************************************
125
template
<
typename
T1,
typename
T2>
126
class
visitable
<T1, T2>
127
{
128
public
:
129
130
virtual
~visitable
() {}
131
132
virtual
void
accept(T1&) = 0;
133
virtual
void
accept(T2&) = 0;
134
};
135
136
//*****************************************************************
140
//*****************************************************************
141
template
<
typename
T1>
142
class
visitable
<T1>
143
{
144
public
:
145
146
virtual
~visitable
() {}
147
148
virtual
void
accept(T1&) = 0;
149
};
150
151
#endif
152
153
//*****************************************************************
156
//*****************************************************************
157
struct
visitor_tag
158
{
159
};
160
161
#if ETL_USING_CPP11 && !defined(ETL_VISITOR_FORCE_CPP03_IMPLEMENTATION)
162
163
//*****************************************************************
166
//*****************************************************************
167
template
<
typename
T1,
typename
... Types>
168
class
visitor
:
public
visitor
<T1>,
public
visitor
<Types...>
169
{
170
public
:
171
172
using
visitor
<T1>::visit;
173
using
visitor
<Types...>::visit;
174
};
175
176
//*****************************************************************
179
//*****************************************************************
180
template
<
typename
T1>
181
class
visitor<T1> :
public
virtual
visitor_tag
182
{
183
public
:
184
185
virtual
~visitor() =
default
;
186
187
virtual
void
visit(T1) = 0;
188
};
189
190
#else
191
192
//*****************************************************************
196
//*****************************************************************
197
template
<
typename
T1,
typename
T2 = void,
typename
T3 = void,
typename
T4 = void,
198
typename
T5 = void,
typename
T6 = void,
typename
T7 = void,
typename
T8 = void,
199
typename
T9 = void,
typename
T10 = void,
typename
T11 = void,
typename
T12 = void,
200
typename
T13 = void,
typename
T14 = void,
typename
T15 = void,
typename
T16 =
void
>
201
class
visitor
:
public
visitor_tag
202
{
203
public
:
204
205
virtual
~visitor
() {}
206
207
virtual
void
visit(T1) = 0;
208
virtual
void
visit(T2) = 0;
209
virtual
void
visit(T3) = 0;
210
virtual
void
visit(T4) = 0;
211
virtual
void
visit(T5) = 0;
212
virtual
void
visit(T6) = 0;
213
virtual
void
visit(T7) = 0;
214
virtual
void
visit(T8) = 0;
215
virtual
void
visit(T9) = 0;
216
virtual
void
visit(T10) = 0;
217
virtual
void
visit(T11) = 0;
218
virtual
void
visit(T12) = 0;
219
virtual
void
visit(T13) = 0;
220
virtual
void
visit(T14) = 0;
221
virtual
void
visit(T15) = 0;
222
virtual
void
visit(T16) = 0;
223
};
224
225
//*****************************************************************
229
//*****************************************************************
230
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
231
typename
T5,
typename
T6,
typename
T7,
typename
T8,
232
typename
T9,
typename
T10,
typename
T11,
typename
T12,
233
typename
T13,
typename
T14,
typename
T15>
234
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> :
public
visitor_tag
235
{
236
public
:
237
238
virtual
~visitor
() {}
239
240
virtual
void
visit(T1) = 0;
241
virtual
void
visit(T2) = 0;
242
virtual
void
visit(T3) = 0;
243
virtual
void
visit(T4) = 0;
244
virtual
void
visit(T5) = 0;
245
virtual
void
visit(T6) = 0;
246
virtual
void
visit(T7) = 0;
247
virtual
void
visit(T8) = 0;
248
virtual
void
visit(T9) = 0;
249
virtual
void
visit(T10) = 0;
250
virtual
void
visit(T11) = 0;
251
virtual
void
visit(T12) = 0;
252
virtual
void
visit(T13) = 0;
253
virtual
void
visit(T14) = 0;
254
virtual
void
visit(T15) = 0;
255
};
256
257
//*****************************************************************
261
//*****************************************************************
262
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
263
typename
T5,
typename
T6,
typename
T7,
typename
T8,
264
typename
T9,
typename
T10,
typename
T11,
typename
T12,
265
typename
T13,
typename
T14>
266
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> :
public
visitor_tag
267
{
268
public
:
269
270
virtual
~visitor
() {}
271
272
virtual
void
visit(T1) = 0;
273
virtual
void
visit(T2) = 0;
274
virtual
void
visit(T3) = 0;
275
virtual
void
visit(T4) = 0;
276
virtual
void
visit(T5) = 0;
277
virtual
void
visit(T6) = 0;
278
virtual
void
visit(T7) = 0;
279
virtual
void
visit(T8) = 0;
280
virtual
void
visit(T9) = 0;
281
virtual
void
visit(T10) = 0;
282
virtual
void
visit(T11) = 0;
283
virtual
void
visit(T12) = 0;
284
virtual
void
visit(T13) = 0;
285
virtual
void
visit(T14) = 0;
286
};
287
288
//*****************************************************************
292
//*****************************************************************
293
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
294
typename
T5,
typename
T6,
typename
T7,
typename
T8,
295
typename
T9,
typename
T10,
typename
T11,
typename
T12,
296
typename
T13>
297
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> :
public
visitor_tag
298
{
299
public
:
300
301
virtual
~visitor
() {}
302
303
virtual
void
visit(T1) = 0;
304
virtual
void
visit(T2) = 0;
305
virtual
void
visit(T3) = 0;
306
virtual
void
visit(T4) = 0;
307
virtual
void
visit(T5) = 0;
308
virtual
void
visit(T6) = 0;
309
virtual
void
visit(T7) = 0;
310
virtual
void
visit(T8) = 0;
311
virtual
void
visit(T9) = 0;
312
virtual
void
visit(T10) = 0;
313
virtual
void
visit(T11) = 0;
314
virtual
void
visit(T12) = 0;
315
virtual
void
visit(T13) = 0;
316
};
317
318
//*****************************************************************
322
//*****************************************************************
323
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
324
typename
T5,
typename
T6,
typename
T7,
typename
T8,
325
typename
T9,
typename
T10,
typename
T11,
typename
T12>
326
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> :
public
visitor_tag
327
{
328
public
:
329
330
virtual
~visitor
() {}
331
332
virtual
void
visit(T1) = 0;
333
virtual
void
visit(T2) = 0;
334
virtual
void
visit(T3) = 0;
335
virtual
void
visit(T4) = 0;
336
virtual
void
visit(T5) = 0;
337
virtual
void
visit(T6) = 0;
338
virtual
void
visit(T7) = 0;
339
virtual
void
visit(T8) = 0;
340
virtual
void
visit(T9) = 0;
341
virtual
void
visit(T10) = 0;
342
virtual
void
visit(T11) = 0;
343
virtual
void
visit(T12) = 0;
344
};
345
346
//*****************************************************************
350
//*****************************************************************
351
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
352
typename
T5,
typename
T6,
typename
T7,
typename
T8,
353
typename
T9,
typename
T10,
typename
T11>
354
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> :
public
visitor_tag
355
{
356
public
:
357
358
virtual
~visitor
() {}
359
360
virtual
void
visit(T1) = 0;
361
virtual
void
visit(T2) = 0;
362
virtual
void
visit(T3) = 0;
363
virtual
void
visit(T4) = 0;
364
virtual
void
visit(T5) = 0;
365
virtual
void
visit(T6) = 0;
366
virtual
void
visit(T7) = 0;
367
virtual
void
visit(T8) = 0;
368
virtual
void
visit(T9) = 0;
369
virtual
void
visit(T10) = 0;
370
virtual
void
visit(T11) = 0;
371
};
372
373
//*****************************************************************
377
//*****************************************************************
378
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
379
typename
T5,
typename
T6,
typename
T7,
typename
T8,
380
typename
T9,
typename
T10>
381
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> :
public
visitor_tag
382
{
383
public
:
384
385
virtual
~visitor
() {}
386
387
virtual
void
visit(T1) = 0;
388
virtual
void
visit(T2) = 0;
389
virtual
void
visit(T3) = 0;
390
virtual
void
visit(T4) = 0;
391
virtual
void
visit(T5) = 0;
392
virtual
void
visit(T6) = 0;
393
virtual
void
visit(T7) = 0;
394
virtual
void
visit(T8) = 0;
395
virtual
void
visit(T9) = 0;
396
virtual
void
visit(T10) = 0;
397
};
398
399
//*****************************************************************
403
//*****************************************************************
404
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
405
typename
T5,
typename
T6,
typename
T7,
typename
T8,
406
typename
T9>
407
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9> :
public
visitor_tag
408
{
409
public
:
410
411
virtual
~visitor
() {}
412
413
virtual
void
visit(T1) = 0;
414
virtual
void
visit(T2) = 0;
415
virtual
void
visit(T3) = 0;
416
virtual
void
visit(T4) = 0;
417
virtual
void
visit(T5) = 0;
418
virtual
void
visit(T6) = 0;
419
virtual
void
visit(T7) = 0;
420
virtual
void
visit(T8) = 0;
421
virtual
void
visit(T9) = 0;
422
};
423
424
//*****************************************************************
428
//*****************************************************************
429
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
430
typename
T5,
typename
T6,
typename
T7,
typename
T8>
431
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8> :
public
visitor_tag
432
{
433
public
:
434
435
virtual
~visitor
() {}
436
437
virtual
void
visit(T1) = 0;
438
virtual
void
visit(T2) = 0;
439
virtual
void
visit(T3) = 0;
440
virtual
void
visit(T4) = 0;
441
virtual
void
visit(T5) = 0;
442
virtual
void
visit(T6) = 0;
443
virtual
void
visit(T7) = 0;
444
virtual
void
visit(T8) = 0;
445
};
446
447
//*****************************************************************
451
//*****************************************************************
452
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
453
typename
T5,
typename
T6,
typename
T7>
454
class
visitor
<T1, T2, T3, T4, T5, T6, T7> :
public
visitor_tag
455
{
456
public
:
457
458
virtual
~visitor
() {}
459
460
virtual
void
visit(T1) = 0;
461
virtual
void
visit(T2) = 0;
462
virtual
void
visit(T3) = 0;
463
virtual
void
visit(T4) = 0;
464
virtual
void
visit(T5) = 0;
465
virtual
void
visit(T6) = 0;
466
virtual
void
visit(T7) = 0;
467
};
468
469
//*****************************************************************
473
//*****************************************************************
474
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
475
typename
T5,
typename
T6>
476
class
visitor
<T1, T2, T3, T4, T5, T6> :
public
visitor_tag
477
{
478
public
:
479
480
virtual
~visitor
() {}
481
482
virtual
void
visit(T1) = 0;
483
virtual
void
visit(T2) = 0;
484
virtual
void
visit(T3) = 0;
485
virtual
void
visit(T4) = 0;
486
virtual
void
visit(T5) = 0;
487
virtual
void
visit(T6) = 0;
488
};
489
490
//*****************************************************************
494
//*****************************************************************
495
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
496
typename
T5>
497
class
visitor
<T1, T2, T3, T4, T5> :
public
visitor_tag
498
{
499
public
:
500
501
virtual
~visitor
() {}
502
503
virtual
void
visit(T1) = 0;
504
virtual
void
visit(T2) = 0;
505
virtual
void
visit(T3) = 0;
506
virtual
void
visit(T4) = 0;
507
virtual
void
visit(T5) = 0;
508
};
509
510
//*****************************************************************
514
//*****************************************************************
515
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4>
516
class
visitor
<T1, T2, T3, T4> :
public
visitor_tag
517
{
518
public
:
519
520
virtual
~visitor
() {}
521
522
virtual
void
visit(T1) = 0;
523
virtual
void
visit(T2) = 0;
524
virtual
void
visit(T3) = 0;
525
virtual
void
visit(T4) = 0;
526
};
527
528
//*****************************************************************
532
//*****************************************************************
533
template
<
typename
T1,
typename
T2,
typename
T3>
534
class
visitor
<T1, T2, T3> :
public
visitor_tag
535
{
536
public
:
537
538
virtual
~visitor
() {}
539
540
virtual
void
visit(T1) = 0;
541
virtual
void
visit(T2) = 0;
542
virtual
void
visit(T3) = 0;
543
};
544
545
//*****************************************************************
549
//*****************************************************************
550
template
<
typename
T1,
typename
T2>
551
class
visitor
<T1, T2> :
public
visitor_tag
552
{
553
public
:
554
555
virtual
~visitor
() {}
556
557
virtual
void
visit(T1) = 0;
558
virtual
void
visit(T2) = 0;
559
};
560
561
//*****************************************************************
565
//*****************************************************************
566
template
<
typename
T1>
567
class
visitor
<T1> :
public
visitor_tag
568
{
569
public
:
570
571
virtual
~visitor
() {}
572
573
virtual
void
visit(T1) = 0;
574
};
575
576
#endif
577
578
//*****************************************************************
581
//*****************************************************************
582
template
<
typename
T>
583
struct
is_visitor
:
public
etl::bool_constant
<etl::is_base_of<etl::visitor_tag, T>::value>
584
{
585
};
586
587
#if ETL_USING_CPP17
588
//*****************************************************************
591
//*****************************************************************
592
template
<
typename
T>
593
constexpr
bool
is_visitor_v = etl::is_visitor<T>::value;
594
#endif
595
}
596
597
#endif
etl::visitable
Definition
visitor.h:92
etl::visitor
Definition
visitor.h:202
etl::is_visitor
Definition
visitor.h:584
etl::visitor_tag
Definition
visitor.h:158
etl
bitset_ext
Definition
absolute.h:39
platform.h
etl::bool_constant
Definition
type_traits_generator.h:912
type_traits.h
include
etl
visitor.h
Generated on
for Embedded Template Library by
1.15.0