Chris@16: // Boost.Range library Chris@16: // Chris@16: // Copyright Jonathan Turkanis 2005. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/range/ Chris@16: // Chris@16: Chris@16: Chris@16: #ifndef BOOST_RANGE_DETAIL_REMOVE_BOUNDS_HPP Chris@16: #define BOOST_RANGE_DETAIL_REMOVE_BOUNDS_HPP Chris@16: Chris@16: #include // MSVC, NO_INTRINSIC_WCHAR_T, put size_t in std. Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace range_detail Chris@16: { Chris@16: Chris@16: template< typename Case1 = mpl::true_, Chris@16: typename Type1 = mpl::void_, Chris@16: typename Case2 = mpl::true_, Chris@16: typename Type2 = mpl::void_, Chris@16: typename Case3 = mpl::true_, Chris@16: typename Type3 = mpl::void_, Chris@16: typename Case4 = mpl::true_, Chris@16: typename Type4 = mpl::void_, Chris@16: typename Case5 = mpl::true_, Chris@16: typename Type5 = mpl::void_, Chris@16: typename Case6 = mpl::true_, Chris@16: typename Type6 = mpl::void_, Chris@16: typename Case7 = mpl::true_, Chris@16: typename Type7 = mpl::void_, Chris@16: typename Case8 = mpl::true_, Chris@16: typename Type8 = mpl::void_, Chris@16: typename Case9 = mpl::true_, Chris@16: typename Type9 = mpl::void_, Chris@16: typename Case10 = mpl::true_, Chris@16: typename Type10 = mpl::void_, Chris@16: typename Case11 = mpl::true_, Chris@16: typename Type11 = mpl::void_, Chris@16: typename Case12 = mpl::true_, Chris@16: typename Type12 = mpl::void_, Chris@16: typename Case13 = mpl::true_, Chris@16: typename Type13 = mpl::void_, Chris@16: typename Case14 = mpl::true_, Chris@16: typename Type14 = mpl::void_, Chris@16: typename Case15 = mpl::true_, Chris@16: typename Type15 = mpl::void_, Chris@16: typename Case16 = mpl::true_, Chris@16: typename Type16 = mpl::void_, Chris@16: typename Case17 = mpl::true_, Chris@16: typename Type17 = mpl::void_, Chris@16: typename Case18 = mpl::true_, Chris@16: typename Type18 = mpl::void_, Chris@16: typename Case19 = mpl::true_, Chris@16: typename Type19 = mpl::void_, Chris@16: typename Case20 = mpl::true_, Chris@16: typename Type20 = mpl::void_> Chris@16: struct select { Chris@16: typedef typename Chris@16: mpl::eval_if< Chris@16: Case1, mpl::identity, mpl::eval_if< Chris@16: Case2, mpl::identity, mpl::eval_if< Chris@16: Case3, mpl::identity, mpl::eval_if< Chris@16: Case4, mpl::identity, mpl::eval_if< Chris@16: Case5, mpl::identity, mpl::eval_if< Chris@16: Case6, mpl::identity, mpl::eval_if< Chris@16: Case7, mpl::identity, mpl::eval_if< Chris@16: Case8, mpl::identity, mpl::eval_if< Chris@16: Case9, mpl::identity, mpl::if_< Chris@16: Case10, Type10, mpl::void_ > > > > > > > > > Chris@16: >::type result1; Chris@16: typedef typename Chris@16: mpl::eval_if< Chris@16: Case11, mpl::identity, mpl::eval_if< Chris@16: Case12, mpl::identity, mpl::eval_if< Chris@16: Case13, mpl::identity, mpl::eval_if< Chris@16: Case14, mpl::identity, mpl::eval_if< Chris@16: Case15, mpl::identity, mpl::eval_if< Chris@16: Case16, mpl::identity, mpl::eval_if< Chris@16: Case17, mpl::identity, mpl::eval_if< Chris@16: Case18, mpl::identity, mpl::eval_if< Chris@16: Case19, mpl::identity, mpl::if_< Chris@16: Case20, Type20, mpl::void_ > > > > > > > > > Chris@16: > result2; Chris@16: typedef typename Chris@16: mpl::eval_if< Chris@16: is_same, Chris@16: result2, Chris@16: mpl::identity Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct remove_extent { Chris@16: static T* ar; Chris@16: BOOST_STATIC_CONSTANT(std::size_t, size = sizeof(*ar) / sizeof((*ar)[0])); Chris@16: Chris@16: typedef typename Chris@16: select< Chris@16: is_same, bool, Chris@16: is_same, char, Chris@16: is_same, signed char, Chris@16: is_same, unsigned char, Chris@16: #ifndef BOOST_NO_INTRINSIC_WCHAR_T Chris@16: is_same, wchar_t, Chris@16: #endif Chris@16: is_same, short, Chris@16: is_same, unsigned short, Chris@16: is_same, int, Chris@16: is_same, unsigned int, Chris@16: is_same, long, Chris@16: is_same, unsigned long, Chris@16: is_same, float, Chris@16: is_same, double, Chris@16: is_same, long double Chris@16: >::type result1; Chris@16: typedef typename Chris@16: select< Chris@16: is_same, const bool, Chris@16: is_same, const char, Chris@16: is_same, const signed char, Chris@16: is_same, const unsigned char, Chris@16: #ifndef BOOST_NO_INTRINSIC_WCHAR_T Chris@16: is_same, const wchar_t, Chris@16: #endif Chris@16: is_same, const short, Chris@16: is_same, const unsigned short, Chris@16: is_same, const int, Chris@16: is_same, const unsigned int, Chris@16: is_same, const long, Chris@16: is_same, const unsigned long, Chris@16: is_same, const float, Chris@16: is_same, const double, Chris@16: is_same, const long double Chris@16: > result2; Chris@16: typedef typename Chris@16: mpl::eval_if< Chris@16: is_same, Chris@16: result2, Chris@16: mpl::identity Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: } // namespace 'range_detail' Chris@16: Chris@16: } // namespace 'boost' Chris@16: Chris@16: Chris@16: #endif