1 /***************************************************************************
2  *  foxxll/common/tmeta.hpp
3  *
4  *  Template Metaprogramming Tools
5  *  (from the Generative Programming book Krysztof Czarnecki, Ulrich Eisenecker)
6  *
7  *  Part of FOXXLL. See http://foxxll.org
8  *
9  *  Copyright (C) 2003 Roman Dementiev <dementiev@mpi-sb.mpg.de>
10  *  Copyright (C) 2008 Andreas Beckmann <beckmann@cs.uni-frankfurt.de>
11  *
12  *  Distributed under the Boost Software License, Version 1.0.
13  *  (See accompanying file LICENSE_1_0.txt or copy at
14  *  http://www.boost.org/LICENSE_1_0.txt)
15  **************************************************************************/
16 
17 #ifndef FOXXLL_COMMON_TMETA_HEADER
18 #define FOXXLL_COMMON_TMETA_HEADER
19 
20 #include <type_traits>
21 
22 #include <foxxll/common/types.hpp>
23 
24 namespace foxxll {
25 
26 const int DEFAULT = ~(~0u >> 1); // initialize with the smallest int
27 
28 struct NilCase { };
29 
30 template <int Tag, class Type_, class Next_ = NilCase>
31 struct CASE
32 {
33     enum { tag = Tag };
34     using Type = Type_;
35     using Next = Next_;
36 };
37 
38 template <int Tag, class Case>
39 class SWITCH
40 {
41     using NextCase = typename Case::Next;
42     enum
43     {
44         caseTag = Case::tag,
45         found = (caseTag == Tag || caseTag == DEFAULT)
46     };
47 
48 public:
49     using type = typename std::conditional<
50                 found,
51                 typename Case::Type,
52                 typename SWITCH<Tag, NextCase>::type
53             >::type;
54 };
55 
56 template <int Tag>
57 class SWITCH<Tag, NilCase>
58 {
59 public:
60     using type = NilCase;
61 };
62 
63 } // namespace foxxll
64 
65 #endif // !FOXXLL_COMMON_TMETA_HEADER
66 
67 /**************************************************************************/
68