Embedded Template Library 1.0
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_traits.h"
36
37//*****************************************************************************
50//*****************************************************************************
51
52namespace 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>
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 //*****************************************************************
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
Definition: visitor.h:92
Definition: visitor.h:202
Definition: visitor.h:584
Definition: visitor.h:158
bitset_ext
Definition: absolute.h:38
Definition: type_traits_generator.h:849