Embedded Template Library  1.0
visitor.h
Go to the documentation of this file.
1 
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 jwellbelove
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 
36 //*****************************************************************************
49 //*****************************************************************************
50 
51 namespace etl
52 {
53 #if ETL_CPP11_SUPPORTED && !defined(ETL_VISITOR_FORCE_CPP03)
54 
55  //*****************************************************************
58  //*****************************************************************
59  template <typename T1, typename... Types>
60  class visitable : public visitable<T1>, public visitable<Types...>
61  {
62  public:
63 
64  using visitable<T1>::accept;
65  using visitable<Types...>::accept;
66  };
67 
68  //*****************************************************************
71  //*****************************************************************
72  template <typename T1>
73  class visitable<T1>
74  {
75  public:
76 
77  virtual ~visitable() {}
78 
79  virtual void accept(T1&) = 0;
80  };
81 
82 #else
83 
84  //*****************************************************************
88  //*****************************************************************
89  template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void>
90  class visitable
91  {
92  public:
93 
94  virtual ~visitable() {}
95 
96  virtual void accept(T1&) = 0;
97  virtual void accept(T2&) = 0;
98  virtual void accept(T3&) = 0;
99  virtual void accept(T4&) = 0;
100  };
101 
102  //*****************************************************************
106  //*****************************************************************
107  template <typename T1, typename T2, typename T3>
108  class visitable<T1, T2, T3>
109  {
110  public:
111 
112  virtual ~visitable() {}
113 
114  virtual void accept(T1&) = 0;
115  virtual void accept(T2&) = 0;
116  virtual void accept(T3&) = 0;
117  };
118 
119  //*****************************************************************
123  //*****************************************************************
124  template <typename T1, typename T2>
125  class visitable<T1, T2>
126  {
127  public:
128 
129  virtual ~visitable() {}
130 
131  virtual void accept(T1&) = 0;
132  virtual void accept(T2&) = 0;
133  };
134 
135  //*****************************************************************
139  //*****************************************************************
140  template <typename T1>
141  class visitable<T1>
142  {
143  public:
144 
145  virtual ~visitable() {}
146 
147  virtual void accept(T1&) = 0;
148  };
149 
150 #endif
151 
152 #if ETL_CPP11_SUPPORTED && !defined(ETL_VISITOR_FORCE_CPP03)
153 
154  //*****************************************************************
157  //*****************************************************************
158  template <typename T1, typename... Types>
159  class visitor : public visitor<T1>, public visitor<Types...>
160  {
161  public:
162 
163  using visitor<T1>::visit;
164  using visitor<Types...>::visit;
165  };
166 
167  //*****************************************************************
170  //*****************************************************************
171  template <typename T1>
172  class visitor<T1>
173  {
174  public:
175 
176  virtual ~visitor() {}
177 
178  virtual void visit(T1&) = 0;
179  };
180 
181 #else
182 
183  //*****************************************************************
187  //*****************************************************************
188  template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void,
189  typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void,
190  typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void,
191  typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void>
192  class visitor
193  {
194  public:
195 
196  virtual ~visitor() {}
197 
198  virtual void visit(T1&) = 0;
199  virtual void visit(T2&) = 0;
200  virtual void visit(T3&) = 0;
201  virtual void visit(T4&) = 0;
202  virtual void visit(T5&) = 0;
203  virtual void visit(T6&) = 0;
204  virtual void visit(T7&) = 0;
205  virtual void visit(T8&) = 0;
206  virtual void visit(T9&) = 0;
207  virtual void visit(T10&) = 0;
208  virtual void visit(T11&) = 0;
209  virtual void visit(T12&) = 0;
210  virtual void visit(T13&) = 0;
211  virtual void visit(T14&) = 0;
212  virtual void visit(T15&) = 0;
213  virtual void visit(T16&) = 0;
214  };
215 
216  //*****************************************************************
220  //*****************************************************************
221  template <typename T1, typename T2, typename T3, typename T4,
222  typename T5, typename T6, typename T7, typename T8,
223  typename T9, typename T10, typename T11, typename T12,
224  typename T13, typename T14, typename T15>
225  class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
226  {
227  public:
228 
229  virtual ~visitor() {}
230 
231  virtual void visit(T1&) = 0;
232  virtual void visit(T2&) = 0;
233  virtual void visit(T3&) = 0;
234  virtual void visit(T4&) = 0;
235  virtual void visit(T5&) = 0;
236  virtual void visit(T6&) = 0;
237  virtual void visit(T7&) = 0;
238  virtual void visit(T8&) = 0;
239  virtual void visit(T9&) = 0;
240  virtual void visit(T10&) = 0;
241  virtual void visit(T11&) = 0;
242  virtual void visit(T12&) = 0;
243  virtual void visit(T13&) = 0;
244  virtual void visit(T14&) = 0;
245  virtual void visit(T15&) = 0;
246  };
247 
248  //*****************************************************************
252  //*****************************************************************
253  template <typename T1, typename T2, typename T3, typename T4,
254  typename T5, typename T6, typename T7, typename T8,
255  typename T9, typename T10, typename T11, typename T12,
256  typename T13, typename T14>
257  class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>
258  {
259  public:
260 
261  virtual ~visitor() {}
262 
263  virtual void visit(T1&) = 0;
264  virtual void visit(T2&) = 0;
265  virtual void visit(T3&) = 0;
266  virtual void visit(T4&) = 0;
267  virtual void visit(T5&) = 0;
268  virtual void visit(T6&) = 0;
269  virtual void visit(T7&) = 0;
270  virtual void visit(T8&) = 0;
271  virtual void visit(T9&) = 0;
272  virtual void visit(T10&) = 0;
273  virtual void visit(T11&) = 0;
274  virtual void visit(T12&) = 0;
275  virtual void visit(T13&) = 0;
276  virtual void visit(T14&) = 0;
277  };
278 
279  //*****************************************************************
283  //*****************************************************************
284  template <typename T1, typename T2, typename T3, typename T4,
285  typename T5, typename T6, typename T7, typename T8,
286  typename T9, typename T10, typename T11, typename T12,
287  typename T13>
288  class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
289  {
290  public:
291 
292  virtual ~visitor() {}
293 
294  virtual void visit(T1&) = 0;
295  virtual void visit(T2&) = 0;
296  virtual void visit(T3&) = 0;
297  virtual void visit(T4&) = 0;
298  virtual void visit(T5&) = 0;
299  virtual void visit(T6&) = 0;
300  virtual void visit(T7&) = 0;
301  virtual void visit(T8&) = 0;
302  virtual void visit(T9&) = 0;
303  virtual void visit(T10&) = 0;
304  virtual void visit(T11&) = 0;
305  virtual void visit(T12&) = 0;
306  virtual void visit(T13&) = 0;
307  };
308 
309  //*****************************************************************
313  //*****************************************************************
314  template <typename T1, typename T2, typename T3, typename T4,
315  typename T5, typename T6, typename T7, typename T8,
316  typename T9, typename T10, typename T11, typename T12>
317  class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
318  {
319  public:
320 
321  virtual ~visitor() {}
322 
323  virtual void visit(T1&) = 0;
324  virtual void visit(T2&) = 0;
325  virtual void visit(T3&) = 0;
326  virtual void visit(T4&) = 0;
327  virtual void visit(T5&) = 0;
328  virtual void visit(T6&) = 0;
329  virtual void visit(T7&) = 0;
330  virtual void visit(T8&) = 0;
331  virtual void visit(T9&) = 0;
332  virtual void visit(T10&) = 0;
333  virtual void visit(T11&) = 0;
334  virtual void visit(T12&) = 0;
335  };
336 
337  //*****************************************************************
341  //*****************************************************************
342  template <typename T1, typename T2, typename T3, typename T4,
343  typename T5, typename T6, typename T7, typename T8,
344  typename T9, typename T10, typename T11>
345  class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
346  {
347  public:
348 
349  virtual ~visitor() {}
350 
351  virtual void visit(T1&) = 0;
352  virtual void visit(T2&) = 0;
353  virtual void visit(T3&) = 0;
354  virtual void visit(T4&) = 0;
355  virtual void visit(T5&) = 0;
356  virtual void visit(T6&) = 0;
357  virtual void visit(T7&) = 0;
358  virtual void visit(T8&) = 0;
359  virtual void visit(T9&) = 0;
360  virtual void visit(T10&) = 0;
361  virtual void visit(T11&) = 0;
362  };
363 
364  //*****************************************************************
368  //*****************************************************************
369  template <typename T1, typename T2, typename T3, typename T4,
370  typename T5, typename T6, typename T7, typename T8,
371  typename T9, typename T10>
372  class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
373  {
374  public:
375 
376  virtual ~visitor() {}
377 
378  virtual void visit(T1&) = 0;
379  virtual void visit(T2&) = 0;
380  virtual void visit(T3&) = 0;
381  virtual void visit(T4&) = 0;
382  virtual void visit(T5&) = 0;
383  virtual void visit(T6&) = 0;
384  virtual void visit(T7&) = 0;
385  virtual void visit(T8&) = 0;
386  virtual void visit(T9&) = 0;
387  virtual void visit(T10&) = 0;
388  };
389 
390  //*****************************************************************
394  //*****************************************************************
395  template <typename T1, typename T2, typename T3, typename T4,
396  typename T5, typename T6, typename T7, typename T8,
397  typename T9>
398  class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9>
399  {
400  public:
401 
402  virtual ~visitor() {}
403 
404  virtual void visit(T1&) = 0;
405  virtual void visit(T2&) = 0;
406  virtual void visit(T3&) = 0;
407  virtual void visit(T4&) = 0;
408  virtual void visit(T5&) = 0;
409  virtual void visit(T6&) = 0;
410  virtual void visit(T7&) = 0;
411  virtual void visit(T8&) = 0;
412  virtual void visit(T9&) = 0;
413  };
414 
415  //*****************************************************************
419  //*****************************************************************
420  template <typename T1, typename T2, typename T3, typename T4,
421  typename T5, typename T6, typename T7, typename T8>
422  class visitor<T1, T2, T3, T4, T5, T6, T7, T8>
423  {
424  public:
425 
426  virtual ~visitor() {}
427 
428  virtual void visit(T1&) = 0;
429  virtual void visit(T2&) = 0;
430  virtual void visit(T3&) = 0;
431  virtual void visit(T4&) = 0;
432  virtual void visit(T5&) = 0;
433  virtual void visit(T6&) = 0;
434  virtual void visit(T7&) = 0;
435  virtual void visit(T8&) = 0;
436  };
437 
438  //*****************************************************************
442  //*****************************************************************
443  template <typename T1, typename T2, typename T3, typename T4,
444  typename T5, typename T6, typename T7>
445  class visitor<T1, T2, T3, T4, T5, T6, T7>
446  {
447  public:
448 
449  virtual ~visitor() {}
450 
451  virtual void visit(T1&) = 0;
452  virtual void visit(T2&) = 0;
453  virtual void visit(T3&) = 0;
454  virtual void visit(T4&) = 0;
455  virtual void visit(T5&) = 0;
456  virtual void visit(T6&) = 0;
457  virtual void visit(T7&) = 0;
458  };
459 
460  //*****************************************************************
464  //*****************************************************************
465  template <typename T1, typename T2, typename T3, typename T4,
466  typename T5, typename T6>
467  class visitor<T1, T2, T3, T4, T5, T6>
468  {
469  public:
470 
471  virtual ~visitor() {}
472 
473  virtual void visit(T1&) = 0;
474  virtual void visit(T2&) = 0;
475  virtual void visit(T3&) = 0;
476  virtual void visit(T4&) = 0;
477  virtual void visit(T5&) = 0;
478  virtual void visit(T6&) = 0;
479  };
480 
481  //*****************************************************************
485  //*****************************************************************
486  template <typename T1, typename T2, typename T3, typename T4,
487  typename T5>
488  class visitor<T1, T2, T3, T4, T5>
489  {
490  public:
491 
492  virtual ~visitor() {}
493 
494  virtual void visit(T1&) = 0;
495  virtual void visit(T2&) = 0;
496  virtual void visit(T3&) = 0;
497  virtual void visit(T4&) = 0;
498  virtual void visit(T5&) = 0;
499  };
500 
501  //*****************************************************************
505  //*****************************************************************
506  template <typename T1, typename T2, typename T3, typename T4>
507  class visitor<T1, T2, T3, T4>
508  {
509  public:
510 
511  virtual ~visitor() {}
512 
513  virtual void visit(T1&) = 0;
514  virtual void visit(T2&) = 0;
515  virtual void visit(T3&) = 0;
516  virtual void visit(T4&) = 0;
517  };
518 
519  //*****************************************************************
523  //*****************************************************************
524  template <typename T1, typename T2, typename T3>
525  class visitor<T1, T2, T3>
526  {
527  public:
528 
529  virtual ~visitor() {}
530 
531  virtual void visit(T1&) = 0;
532  virtual void visit(T2&) = 0;
533  virtual void visit(T3&) = 0;
534  };
535 
536  //*****************************************************************
540  //*****************************************************************
541  template <typename T1, typename T2>
542  class visitor<T1, T2>
543  {
544  public:
545 
546  virtual ~visitor() {}
547 
548  virtual void visit(T1&) = 0;
549  virtual void visit(T2&) = 0;
550  };
551 
552  //*****************************************************************
556  //*****************************************************************
557  template <typename T1>
558  class visitor<T1>
559  {
560  public:
561 
562  virtual ~visitor() {}
563 
564  virtual void visit(T1&) = 0;
565  };
566 
567 #endif
568 }
569 
570 #endif
Definition: visitor.h:91
Definition: visitor.h:193
Definition: absolute.h:37