]>
Dogcows Code - chaz/yoink/blob - src/Moof/cml/core/meta/switch.h
1 /* -*- C++ -*- ------------------------------------------------------------
3 Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
5 The Configurable Math Library (CML) is distributed under the terms of the
6 Boost Software License, v1.0 (see cml/LICENSE for details).
8 *-----------------------------------------------------------------------*/
16 #include <cml/core/meta/common.h>
17 #include <cml/core/meta/if.h>
21 struct NilCase
{}; /* For terminating the case list. */
22 struct Default
{}; /* For indicating the default result. */
24 /* The working parts of the meta-switch go into namespace meta: */
27 /* "Interior" case statements: */
28 template<typename Case
, typename Result
, typename NextCase
>
31 template<typename Find
> struct match
{
32 typedef typename select_if
<
33 same_type
<Find
,Case
>::is_true
,
35 typename
NextCase::template match
<Find
>::result
40 /* Default case, returned when no match is found in a previous case: */
41 template<typename Result
>
42 struct select_case
<Default
,Result
,NilCase
>
44 template<typename Find
> struct match
{
45 typedef Result result
;
49 /* The last case statement (if no match until now, the result is 'void'): */
50 template<typename Case
, typename Result
>
51 struct select_case
<Case
,Result
,NilCase
>
53 template<typename Find
> struct match
{
54 typedef typename select_if
<
55 same_type
<Find
,Case
>::is_true
,
64 /** Return the matched type (like a switch/case statement).
66 * This is a convenience wrapper to avoid having to explicitly type out
67 * select_case for each case in the list of types to match against.
69 template<typename Find
70 , typename T1
, typename R1
71 , typename T2
= NilCase
, typename R2
= void
72 , typename T3
= NilCase
, typename R3
= void
73 , typename T4
= NilCase
, typename R4
= void
74 , typename T5
= NilCase
, typename R5
= void
75 , typename T6
= NilCase
, typename R6
= void
76 , typename T7
= NilCase
, typename R7
= void
77 , typename T8
= NilCase
, typename R8
= void
78 , typename T9
= NilCase
, typename R9
= void
79 , typename T10
= NilCase
, typename R10
= void
80 , typename T11
= NilCase
, typename R11
= void
81 , typename T12
= NilCase
, typename R12
= void
82 , typename T13
= NilCase
, typename R13
= void
83 , typename T14
= NilCase
, typename R14
= void
84 , typename T15
= NilCase
, typename R15
= void
85 , typename T16
= NilCase
, typename R16
= void
86 #if !defined(_MSC_VER)
87 , typename T17
= NilCase
, typename R17
= void
88 , typename T18
= NilCase
, typename R18
= void
89 , typename T19
= NilCase
, typename R19
= void
90 , typename T20
= NilCase
, typename R20
= void
91 , typename T21
= NilCase
, typename R21
= void
92 , typename T22
= NilCase
, typename R22
= void
93 , typename T23
= NilCase
, typename R23
= void
94 , typename T24
= NilCase
, typename R24
= void
95 , typename T25
= NilCase
, typename R25
= void
96 , typename T26
= NilCase
, typename R26
= void
97 , typename T27
= NilCase
, typename R27
= void
98 , typename T28
= NilCase
, typename R28
= void
99 , typename T29
= NilCase
, typename R29
= void
100 , typename T30
= NilCase
, typename R30
= void
101 , typename T31
= NilCase
, typename R31
= void
102 , typename T32
= NilCase
, typename R32
= void
103 , typename T33
= NilCase
, typename R33
= void
104 , typename T34
= NilCase
, typename R34
= void
105 , typename T35
= NilCase
, typename R35
= void
106 , typename T36
= NilCase
, typename R36
= void
107 , typename T37
= NilCase
, typename R37
= void
108 , typename T38
= NilCase
, typename R38
= void
109 , typename T39
= NilCase
, typename R39
= void
110 , typename T40
= NilCase
, typename R40
= void
112 > struct select_switch
115 meta::select_case
< T1
,R1
116 , meta::select_case
< T2
,R2
117 , meta::select_case
< T3
,R3
118 , meta::select_case
< T4
,R4
119 , meta::select_case
< T5
,R5
120 , meta::select_case
< T6
,R6
121 , meta::select_case
< T7
,R7
122 , meta::select_case
< T8
,R8
123 , meta::select_case
< T9
,R9
124 , meta::select_case
< T10
,R10
125 , meta::select_case
< T11
,R11
126 , meta::select_case
< T12
,R12
127 , meta::select_case
< T13
,R13
128 , meta::select_case
< T14
,R14
129 , meta::select_case
< T15
,R15
130 , meta::select_case
< T16
,R16
131 #if !defined(_MSC_VER)
132 , meta::select_case
< T17
,R17
133 , meta::select_case
< T18
,R18
134 , meta::select_case
< T19
,R19
135 , meta::select_case
< T20
,R20
136 , meta::select_case
< T21
,R21
137 , meta::select_case
< T22
,R22
138 , meta::select_case
< T23
,R23
139 , meta::select_case
< T24
,R24
140 , meta::select_case
< T25
,R25
141 , meta::select_case
< T26
,R26
142 , meta::select_case
< T27
,R27
143 , meta::select_case
< T28
,R28
144 , meta::select_case
< T29
,R29
145 , meta::select_case
< T30
,R30
146 , meta::select_case
< T31
,R31
147 , meta::select_case
< T32
,R32
148 , meta::select_case
< T33
,R33
149 , meta::select_case
< T34
,R34
150 , meta::select_case
< T35
,R35
151 , meta::select_case
< T36
,R36
152 , meta::select_case
< T37
,R37
153 , meta::select_case
< T38
,R38
154 , meta::select_case
< T39
,R39
155 , meta::select_case
< T40
,R40
157 > > > > > > > > > > /* 10 */
158 > > > > > > > > > > /* 10 */
164 > > > > > > > > > > /* 10 */
165 ::template match
<Find
>::result result
;
172 // -------------------------------------------------------------------------
This page took 0.038657 seconds and 4 git commands to generate.