Jeff Thompson | ef2d5a4 | 2013-08-22 19:09:24 -0700 | [diff] [blame] | 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 | |
Jeff Thompson | 3d613fd | 2013-10-15 15:39:04 -0700 | [diff] [blame^] | 12 | #ifndef NDNBOOST_RANGE_DETAIL_REMOVE_BOUNDS_HPP |
| 13 | #define NDNBOOST_RANGE_DETAIL_REMOVE_BOUNDS_HPP |
Jeff Thompson | ef2d5a4 | 2013-08-22 19:09:24 -0700 | [diff] [blame] | 14 | |
| 15 | #include <ndnboost/config.hpp> // MSVC, NO_INTRINSIC_WCHAR_T, put size_t in std. |
| 16 | #include <cstddef> |
| 17 | #include <ndnboost/mpl/eval_if.hpp> |
| 18 | #include <ndnboost/mpl/identity.hpp> |
| 19 | #include <ndnboost/type_traits/is_same.hpp> |
| 20 | |
| 21 | namespace ndnboost |
| 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; |
Jeff Thompson | 3d613fd | 2013-10-15 15:39:04 -0700 | [diff] [blame^] | 104 | NDNBOOST_STATIC_CONSTANT(std::size_t, size = sizeof(*ar) / sizeof((*ar)[0])); |
Jeff Thompson | ef2d5a4 | 2013-08-22 19:09:24 -0700 | [diff] [blame] | 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, |
Jeff Thompson | 3d613fd | 2013-10-15 15:39:04 -0700 | [diff] [blame^] | 112 | #ifndef NDNBOOST_NO_INTRINSIC_WCHAR_T |
Jeff Thompson | ef2d5a4 | 2013-08-22 19:09:24 -0700 | [diff] [blame] | 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, |
Jeff Thompson | 3d613fd | 2013-10-15 15:39:04 -0700 | [diff] [blame^] | 131 | #ifndef NDNBOOST_NO_INTRINSIC_WCHAR_T |
Jeff Thompson | ef2d5a4 | 2013-08-22 19:09:24 -0700 | [diff] [blame] | 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 |