]> Dogcows Code - chaz/yoink/blob - src/Moof/cml/core/meta/switch.h
extreme refactoring
[chaz/yoink] / src / Moof / cml / core / meta / switch.h
1 /* -*- C++ -*- ------------------------------------------------------------
2
3 Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
4
5 The Configurable Math Library (CML) is distributed under the terms of the
6 Boost Software License, v1.0 (see cml/LICENSE for details).
7
8 *-----------------------------------------------------------------------*/
9 /** @file
10 * @brief
11 */
12
13 #ifndef meta_switch_h
14 #define meta_switch_h
15
16 #include <cml/core/meta/common.h>
17 #include <cml/core/meta/if.h>
18
19 namespace cml {
20
21 struct NilCase {}; /* For terminating the case list. */
22 struct Default {}; /* For indicating the default result. */
23
24 /* The working parts of the meta-switch go into namespace meta: */
25 namespace meta {
26
27 /* "Interior" case statements: */
28 template<typename Case, typename Result, typename NextCase>
29 struct select_case
30 {
31 template<typename Find> struct match {
32 typedef typename select_if<
33 same_type<Find,Case>::is_true,
34 Result,
35 typename NextCase::template match<Find>::result
36 >::result result;
37 };
38 };
39
40 /* Default case, returned when no match is found in a previous case: */
41 template<typename Result>
42 struct select_case<Default,Result,NilCase>
43 {
44 template<typename Find> struct match {
45 typedef Result result;
46 };
47 };
48
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>
52 {
53 template<typename Find> struct match {
54 typedef typename select_if<
55 same_type<Find,Case>::is_true,
56 Result,
57 void
58 >::result result;
59 };
60 };
61
62 } // namespace meta
63
64 /** Return the matched type (like a switch/case statement).
65 *
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.
68 */
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
111 #endif
112 > struct select_switch
113 {
114 typedef typename
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
156 , NilCase
157 > > > > > > > > > > /* 10 */
158 > > > > > > > > > > /* 10 */
159 > > > > /* 4 */
160 #else
161 , NilCase
162 #endif
163 > > > > > > /* 6 */
164 > > > > > > > > > > /* 10 */
165 ::template match<Find>::result result;
166 };
167
168 } // namespace cml
169
170 #endif
171
172 // -------------------------------------------------------------------------
173 // vim:ft=cpp
This page took 0.0416069999999999 seconds and 4 git commands to generate.