Embedded Template Library
1.0
Toggle main menu visibility
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_list.h"
36
#include "
type_traits.h
"
37
38
//*****************************************************************************
51
//*****************************************************************************
52
53
namespace
etl
54
{
55
#if ETL_USING_CPP11 && !defined(ETL_VISITOR_FORCE_CPP03_IMPLEMENTATION)
56
57
//*****************************************************************
60
//*****************************************************************
61
template
<
typename
T1,
typename
... Types>
62
class
visitable
63
:
public
visitable
<T1>
64
,
public
visitable
<Types...>
65
{
66
public
:
67
68
using
visitable<T1>::accept;
69
using
visitable<Types...>::accept;
70
using
type_list = etl::type_list<T1, Types...>;
71
};
72
73
//*****************************************************************
76
//*****************************************************************
77
template
<
typename
T1>
78
class
visitable
<T1>
79
{
80
public
:
81
82
using
type_list = etl::type_list<T1>;
83
84
virtual
~visitable() =
default
;
85
86
virtual
void
accept(T1&) = 0;
87
};
88
89
//***************************************************************************
91
template
<
typename
TList>
92
struct
visitable_from_type_list;
93
94
template
<
typename
... TTypes>
95
struct
visitable_from_type_list<etl::type_list<TTypes...>>
96
{
97
using
type = etl::visitable<TTypes...>;
98
};
99
100
template
<
typename
TTypeList>
101
using
visitable_from_type_list_t =
typename
visitable_from_type_list<TTypeList>::type;
102
103
#else
104
105
//*****************************************************************
109
//*****************************************************************
110
template
<
typename
T1,
typename
T2 =
void
,
typename
T3 =
void
,
typename
T4 =
void
>
111
class
visitable
112
{
113
public
:
114
115
virtual
~visitable
() {}
116
117
virtual
void
accept(T1&) = 0;
118
virtual
void
accept(T2&) = 0;
119
virtual
void
accept(T3&) = 0;
120
virtual
void
accept(T4&) = 0;
121
};
122
123
//*****************************************************************
127
//*****************************************************************
128
template
<
typename
T1,
typename
T2,
typename
T3>
129
class
visitable
<T1, T2, T3>
130
{
131
public
:
132
133
virtual
~visitable
() {}
134
135
virtual
void
accept(T1&) = 0;
136
virtual
void
accept(T2&) = 0;
137
virtual
void
accept(T3&) = 0;
138
};
139
140
//*****************************************************************
144
//*****************************************************************
145
template
<
typename
T1,
typename
T2>
146
class
visitable
<T1, T2>
147
{
148
public
:
149
150
virtual
~visitable
() {}
151
152
virtual
void
accept(T1&) = 0;
153
virtual
void
accept(T2&) = 0;
154
};
155
156
//*****************************************************************
160
//*****************************************************************
161
template
<
typename
T1>
162
class
visitable
<T1>
163
{
164
public
:
165
166
virtual
~visitable
() {}
167
168
virtual
void
accept(T1&) = 0;
169
};
170
171
#endif
172
173
//*****************************************************************
176
//*****************************************************************
177
struct
visitor_tag
178
{
179
};
180
181
#if ETL_USING_CPP11 && !defined(ETL_VISITOR_FORCE_CPP03_IMPLEMENTATION)
182
183
//*****************************************************************
186
//*****************************************************************
187
template
<
typename
T1,
typename
... Types>
188
class
visitor
189
:
public
visitor
<T1>
190
,
public
visitor
<Types...>
191
{
192
public
:
193
194
using
visitor
<T1>::visit;
195
using
visitor
<Types...>::visit;
196
};
197
198
//*****************************************************************
201
//*****************************************************************
202
template
<
typename
T1>
203
class
visitor<T1> :
public
virtual
visitor_tag
204
{
205
public
:
206
207
virtual
~visitor() =
default
;
208
209
virtual
void
visit(T1) = 0;
210
};
211
212
//***************************************************************************
214
template
<
typename
TList>
215
struct
visitor_from_type_list;
216
217
template
<
typename
... TTypes>
218
struct
visitor_from_type_list<etl::type_list<TTypes...>>
219
{
220
using
type = etl::visitor<TTypes...>;
221
};
222
223
template
<
typename
TTypeList>
224
using
visitor_from_type_list_t =
typename
visitor_from_type_list<TTypeList>::type;
225
226
#else
227
228
//*****************************************************************
232
//*****************************************************************
233
template
<
typename
T1,
typename
T2 = void,
typename
T3 = void,
typename
T4 = void,
typename
T5 = void,
typename
T6 = void,
typename
T7 = void,
234
typename
T8 = void,
typename
T9 = void,
typename
T10 = void,
typename
T11 = void,
typename
T12 = void,
typename
T13 = void,
235
typename
T14 = void,
typename
T15 = void,
typename
T16 =
void
>
236
class
visitor
:
public
visitor_tag
237
{
238
public
:
239
240
virtual
~visitor
() {}
241
242
virtual
void
visit(T1) = 0;
243
virtual
void
visit(T2) = 0;
244
virtual
void
visit(T3) = 0;
245
virtual
void
visit(T4) = 0;
246
virtual
void
visit(T5) = 0;
247
virtual
void
visit(T6) = 0;
248
virtual
void
visit(T7) = 0;
249
virtual
void
visit(T8) = 0;
250
virtual
void
visit(T9) = 0;
251
virtual
void
visit(T10) = 0;
252
virtual
void
visit(T11) = 0;
253
virtual
void
visit(T12) = 0;
254
virtual
void
visit(T13) = 0;
255
virtual
void
visit(T14) = 0;
256
virtual
void
visit(T15) = 0;
257
virtual
void
visit(T16) = 0;
258
};
259
260
//*****************************************************************
264
//*****************************************************************
265
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8,
typename
T9,
typename
T10,
266
typename
T11,
typename
T12,
typename
T13,
typename
T14,
typename
T15>
267
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> :
public
visitor_tag
268
{
269
public
:
270
271
virtual
~visitor
() {}
272
273
virtual
void
visit(T1) = 0;
274
virtual
void
visit(T2) = 0;
275
virtual
void
visit(T3) = 0;
276
virtual
void
visit(T4) = 0;
277
virtual
void
visit(T5) = 0;
278
virtual
void
visit(T6) = 0;
279
virtual
void
visit(T7) = 0;
280
virtual
void
visit(T8) = 0;
281
virtual
void
visit(T9) = 0;
282
virtual
void
visit(T10) = 0;
283
virtual
void
visit(T11) = 0;
284
virtual
void
visit(T12) = 0;
285
virtual
void
visit(T13) = 0;
286
virtual
void
visit(T14) = 0;
287
virtual
void
visit(T15) = 0;
288
};
289
290
//*****************************************************************
294
//*****************************************************************
295
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8,
typename
T9,
typename
T10,
296
typename
T11,
typename
T12,
typename
T13,
typename
T14>
297
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> :
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
virtual
void
visit(T14) = 0;
317
};
318
319
//*****************************************************************
323
//*****************************************************************
324
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8,
typename
T9,
typename
T10,
325
typename
T11,
typename
T12,
typename
T13>
326
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> :
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
virtual
void
visit(T13) = 0;
345
};
346
347
//*****************************************************************
351
//*****************************************************************
352
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8,
typename
T9,
typename
T10,
353
typename
T11,
typename
T12>
354
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> :
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
virtual
void
visit(T12) = 0;
372
};
373
374
//*****************************************************************
378
//*****************************************************************
379
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8,
typename
T9,
typename
T10,
380
typename
T11>
381
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> :
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
virtual
void
visit(T11) = 0;
398
};
399
400
//*****************************************************************
404
//*****************************************************************
405
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8,
typename
T9,
typename
T10>
406
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> :
public
visitor_tag
407
{
408
public
:
409
410
virtual
~visitor
() {}
411
412
virtual
void
visit(T1) = 0;
413
virtual
void
visit(T2) = 0;
414
virtual
void
visit(T3) = 0;
415
virtual
void
visit(T4) = 0;
416
virtual
void
visit(T5) = 0;
417
virtual
void
visit(T6) = 0;
418
virtual
void
visit(T7) = 0;
419
virtual
void
visit(T8) = 0;
420
virtual
void
visit(T9) = 0;
421
virtual
void
visit(T10) = 0;
422
};
423
424
//*****************************************************************
428
//*****************************************************************
429
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8,
typename
T9>
430
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8, T9> :
public
visitor_tag
431
{
432
public
:
433
434
virtual
~visitor
() {}
435
436
virtual
void
visit(T1) = 0;
437
virtual
void
visit(T2) = 0;
438
virtual
void
visit(T3) = 0;
439
virtual
void
visit(T4) = 0;
440
virtual
void
visit(T5) = 0;
441
virtual
void
visit(T6) = 0;
442
virtual
void
visit(T7) = 0;
443
virtual
void
visit(T8) = 0;
444
virtual
void
visit(T9) = 0;
445
};
446
447
//*****************************************************************
451
//*****************************************************************
452
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7,
typename
T8>
453
class
visitor
<T1, T2, T3, T4, T5, T6, T7, T8> :
public
visitor_tag
454
{
455
public
:
456
457
virtual
~visitor
() {}
458
459
virtual
void
visit(T1) = 0;
460
virtual
void
visit(T2) = 0;
461
virtual
void
visit(T3) = 0;
462
virtual
void
visit(T4) = 0;
463
virtual
void
visit(T5) = 0;
464
virtual
void
visit(T6) = 0;
465
virtual
void
visit(T7) = 0;
466
virtual
void
visit(T8) = 0;
467
};
468
469
//*****************************************************************
473
//*****************************************************************
474
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6,
typename
T7>
475
class
visitor
<T1, T2, T3, T4, T5, T6, T7> :
public
visitor_tag
476
{
477
public
:
478
479
virtual
~visitor
() {}
480
481
virtual
void
visit(T1) = 0;
482
virtual
void
visit(T2) = 0;
483
virtual
void
visit(T3) = 0;
484
virtual
void
visit(T4) = 0;
485
virtual
void
visit(T5) = 0;
486
virtual
void
visit(T6) = 0;
487
virtual
void
visit(T7) = 0;
488
};
489
490
//*****************************************************************
494
//*****************************************************************
495
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5,
typename
T6>
496
class
visitor
<T1, T2, T3, T4, T5, T6> :
public
visitor_tag
497
{
498
public
:
499
500
virtual
~visitor
() {}
501
502
virtual
void
visit(T1) = 0;
503
virtual
void
visit(T2) = 0;
504
virtual
void
visit(T3) = 0;
505
virtual
void
visit(T4) = 0;
506
virtual
void
visit(T5) = 0;
507
virtual
void
visit(T6) = 0;
508
};
509
510
//*****************************************************************
514
//*****************************************************************
515
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4,
typename
T5>
516
class
visitor
<T1, T2, T3, T4, T5> :
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
virtual
void
visit(T5) = 0;
527
};
528
529
//*****************************************************************
533
//*****************************************************************
534
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4>
535
class
visitor
<T1, T2, T3, T4> :
public
visitor_tag
536
{
537
public
:
538
539
virtual
~visitor
() {}
540
541
virtual
void
visit(T1) = 0;
542
virtual
void
visit(T2) = 0;
543
virtual
void
visit(T3) = 0;
544
virtual
void
visit(T4) = 0;
545
};
546
547
//*****************************************************************
551
//*****************************************************************
552
template
<
typename
T1,
typename
T2,
typename
T3>
553
class
visitor
<T1, T2, T3> :
public
visitor_tag
554
{
555
public
:
556
557
virtual
~visitor
() {}
558
559
virtual
void
visit(T1) = 0;
560
virtual
void
visit(T2) = 0;
561
virtual
void
visit(T3) = 0;
562
};
563
564
//*****************************************************************
568
//*****************************************************************
569
template
<
typename
T1,
typename
T2>
570
class
visitor
<T1, T2> :
public
visitor_tag
571
{
572
public
:
573
574
virtual
~visitor
() {}
575
576
virtual
void
visit(T1) = 0;
577
virtual
void
visit(T2) = 0;
578
};
579
580
//*****************************************************************
584
//*****************************************************************
585
template
<
typename
T1>
586
class
visitor
<T1> :
public
visitor_tag
587
{
588
public
:
589
590
virtual
~visitor
() {}
591
592
virtual
void
visit(T1) = 0;
593
};
594
595
#endif
596
597
//*****************************************************************
600
//*****************************************************************
601
template
<
typename
T>
602
struct
is_visitor
:
public
etl::bool_constant
<etl::is_base_of<etl::visitor_tag, T>::value>
603
{
604
};
605
606
#if ETL_USING_CPP17
607
//*****************************************************************
610
//*****************************************************************
611
template
<
typename
T>
612
constexpr
bool
is_visitor_v = etl::is_visitor<T>::value;
613
#endif
614
}
// namespace etl
615
616
#endif
etl::visitable
Definition
visitor.h:112
etl::visitor
Definition
visitor.h:237
etl::is_visitor
Definition
visitor.h:603
etl::visitor_tag
Definition
visitor.h:178
etl
Definition
absolute.h:40
platform.h
etl::bool_constant
Definition
type_traits.h:97
type_traits.h
include
etl
visitor.h
Generated on
for Embedded Template Library by
1.17.0