Embedded Template Library 1.0
Loading...
Searching...
No Matches
visitor.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2014 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
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
53namespace 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>
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 //*****************************************************************
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
Definition visitor.h:112
Definition visitor.h:237
Definition visitor.h:603
Definition visitor.h:178
bitset_ext
Definition absolute.h:40
Definition type_traits.h:97