]>
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 > struct select_switch
89 meta::select_case
< T1
,R1
90 , meta::select_case
< T2
,R2
91 , meta::select_case
< T3
,R3
92 , meta::select_case
< T4
,R4
93 , meta::select_case
< T5
,R5
94 , meta::select_case
< T6
,R6
95 , meta::select_case
< T7
,R7
96 , meta::select_case
< T8
,R8
97 , meta::select_case
< T9
,R9
98 , meta::select_case
< T10
,R10
99 , meta::select_case
< T11
,R11
100 , meta::select_case
< T12
,R12
101 , meta::select_case
< T13
,R13
102 , meta::select_case
< T14
,R14
103 , meta::select_case
< T15
,R15
104 , meta::select_case
< T16
,R16
107 > > > > > > > > > > /* 10 */
108 ::template match
<Find
>::result result
;
115 // -------------------------------------------------------------------------
This page took 0.038934 seconds and 4 git commands to generate.