PageRenderTime 34ms CodeModel.GetById 18ms app.highlight 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/range/detail/remove_extent.hpp

http://hadesmem.googlecode.com/
C++ Header | 157 lines | 137 code | 11 blank | 9 comment | 0 complexity | e7a7f7d41e0e1b494123b1323c2477f3 MD5 | raw file
  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
 21namespace 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