]> git.donarmstrong.com Git - rsem.git/blob - boost/range/detail/remove_extent.hpp
Updated boost to v1.55.0
[rsem.git] / boost / range / detail / remove_extent.hpp
1 // Boost.Range library
2 //
3 //  Copyright Jonathan Turkanis 2005. Use, modification and
4 //  distribution is subject to the Boost Software License, Version
5 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // For more information, see http://www.boost.org/libs/range/
9 //
10
11
12 #ifndef BOOST_RANGE_DETAIL_REMOVE_BOUNDS_HPP
13 #define BOOST_RANGE_DETAIL_REMOVE_BOUNDS_HPP
14
15 #include <boost/config.hpp>  // MSVC, NO_INTRINSIC_WCHAR_T, put size_t in std.
16 #include <cstddef>
17 #include <boost/mpl/eval_if.hpp>
18 #include <boost/mpl/identity.hpp>
19 #include <boost/type_traits/is_same.hpp>
20
21 namespace boost 
22 {
23     namespace range_detail
24     {
25         
26         template< typename Case1 = mpl::true_,
27                   typename Type1 = mpl::void_,
28                   typename Case2 = mpl::true_,
29                   typename Type2 = mpl::void_,
30                   typename Case3 = mpl::true_,
31                   typename Type3 = mpl::void_,
32                   typename Case4 = mpl::true_,
33                   typename Type4 = mpl::void_,
34                   typename Case5 = mpl::true_,
35                   typename Type5 = mpl::void_,
36                   typename Case6 = mpl::true_,
37                   typename Type6 = mpl::void_,
38                   typename Case7 = mpl::true_,
39                   typename Type7 = mpl::void_,
40                   typename Case8 = mpl::true_,
41                   typename Type8 = mpl::void_,
42                   typename Case9 = mpl::true_,
43                   typename Type9 = mpl::void_,
44                   typename Case10 = mpl::true_,
45                   typename Type10 = mpl::void_,
46                   typename Case11 = mpl::true_,
47                   typename Type11 = mpl::void_,
48                   typename Case12 = mpl::true_,
49                   typename Type12 = mpl::void_,
50                   typename Case13 = mpl::true_,
51                   typename Type13 = mpl::void_,
52                   typename Case14 = mpl::true_,
53                   typename Type14 = mpl::void_,
54                   typename Case15 = mpl::true_,
55                   typename Type15 = mpl::void_,
56                   typename Case16 = mpl::true_,
57                   typename Type16 = mpl::void_,
58                   typename Case17 = mpl::true_,
59                   typename Type17 = mpl::void_,
60                   typename Case18 = mpl::true_,
61                   typename Type18 = mpl::void_,
62                   typename Case19 = mpl::true_,
63                   typename Type19 = mpl::void_,
64                   typename Case20 = mpl::true_,
65                   typename Type20 = mpl::void_>
66         struct select {
67             typedef typename
68                     mpl::eval_if<
69                         Case1, mpl::identity<Type1>, mpl::eval_if<
70                         Case2, mpl::identity<Type2>, mpl::eval_if<
71                         Case3, mpl::identity<Type3>, mpl::eval_if<
72                         Case4, mpl::identity<Type4>, mpl::eval_if<
73                         Case5, mpl::identity<Type5>, mpl::eval_if<
74                         Case6, mpl::identity<Type6>, mpl::eval_if<
75                         Case7, mpl::identity<Type7>, mpl::eval_if<
76                         Case8, mpl::identity<Type8>, mpl::eval_if<
77                         Case9, mpl::identity<Type9>, mpl::if_<
78                         Case10, Type10, mpl::void_ > > > > > > > > >
79                     >::type result1;
80             typedef typename
81                     mpl::eval_if<
82                         Case11, mpl::identity<Type11>, mpl::eval_if<
83                         Case12, mpl::identity<Type12>, mpl::eval_if<
84                         Case13, mpl::identity<Type13>, mpl::eval_if<
85                         Case14, mpl::identity<Type14>, mpl::eval_if<
86                         Case15, mpl::identity<Type15>, mpl::eval_if<
87                         Case16, mpl::identity<Type16>, mpl::eval_if<
88                         Case17, mpl::identity<Type17>, mpl::eval_if<
89                         Case18, mpl::identity<Type18>, mpl::eval_if<
90                         Case19, mpl::identity<Type19>, mpl::if_<
91                         Case20, Type20, mpl::void_ > > > > > > > > >
92                     > result2;
93             typedef typename    
94                     mpl::eval_if<
95                         is_same<result1, mpl::void_>,
96                         result2,
97                         mpl::identity<result1>
98                     >::type type;
99         };
100
101         template<typename T>
102         struct remove_extent {
103             static T* ar;
104             BOOST_STATIC_CONSTANT(std::size_t, size = sizeof(*ar) / sizeof((*ar)[0]));
105
106             typedef typename
107                     select<
108                         is_same<T, bool[size]>,                  bool,
109                         is_same<T, char[size]>,                  char,
110                         is_same<T, signed char[size]>,           signed char,
111                         is_same<T, unsigned char[size]>,         unsigned char,
112                     #ifndef BOOST_NO_INTRINSIC_WCHAR_T
113                         is_same<T, wchar_t[size]>,               wchar_t,
114                     #endif
115                         is_same<T, short[size]>,                 short,
116                         is_same<T, unsigned short[size]>,        unsigned short,
117                         is_same<T, int[size]>,                   int,
118                         is_same<T, unsigned int[size]>,          unsigned int,
119                         is_same<T, long[size]>,                  long,
120                         is_same<T, unsigned long[size]>,         unsigned long,
121                         is_same<T, float[size]>,                 float,
122                         is_same<T, double[size]>,                double,
123                         is_same<T, long double[size]>,           long double
124                     >::type result1;
125             typedef typename
126                     select<
127                         is_same<T, const bool[size]>,            const bool,
128                         is_same<T, const char[size]>,            const char,
129                         is_same<T, const signed char[size]>,     const signed char,
130                         is_same<T, const unsigned char[size]>,   const unsigned char,
131                     #ifndef BOOST_NO_INTRINSIC_WCHAR_T
132                         is_same<T, const wchar_t[size]>,         const wchar_t,
133                     #endif
134                         is_same<T, const short[size]>,           const short,
135                         is_same<T, const unsigned short[size]>,  const unsigned short,
136                         is_same<T, const int[size]>,             const int,
137                         is_same<T, const unsigned int[size]>,    const unsigned int,
138                         is_same<T, const long[size]>,            const long,
139                         is_same<T, const unsigned long[size]>,   const unsigned long,
140                         is_same<T, const float[size]>,           const float,
141                         is_same<T, const double[size]>,          const double,
142                         is_same<T, const long double[size]>,     const long double
143                     > result2;
144             typedef typename
145                     mpl::eval_if<
146                         is_same<result1, mpl::void_>,
147                         result2,
148                         mpl::identity<result1>
149                     >::type type;
150         };
151
152     } // namespace 'range_detail'
153
154 } // namespace 'boost'
155
156
157 #endif