1 2 // (C) Copyright John Maddock 2005. 3 // Use, modification and distribution are subject to the Boost Software License, 4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt). 6 // 7 // See http://www.boost.org/libs/type_traits for most recent version including documentation. 8 9 10 #ifndef BOOST_TT_RANK_HPP_INCLUDED 11 #define BOOST_TT_RANK_HPP_INCLUDED 12 13 #include <cstddef> // size_t 14 #include <boost/type_traits/integral_constant.hpp> 15 16 namespace boost { 17 18 #if !defined( BOOST_CODEGEARC ) 19 20 namespace detail{ 21 22 template <class T, std::size_t N> 23 struct rank_imp 24 { 25 BOOST_STATIC_CONSTANT(std::size_t, value = N); 26 }; 27 #if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) 28 template <class T, std::size_t R, std::size_t N> 29 struct rank_imp<T[R], N> 30 { 31 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 32 }; 33 34 template <class T, std::size_t R, std::size_t N> 35 struct rank_imp<T const[R], N> 36 { 37 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 38 }; 39 40 template <class T, std::size_t R, std::size_t N> 41 struct rank_imp<T volatile[R], N> 42 { 43 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 44 }; 45 46 template <class T, std::size_t R, std::size_t N> 47 struct rank_imp<T const volatile[R], N> 48 { 49 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 50 }; 51 52 #if !BOOST_WORKAROUND(BOOST_BORLANDC, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) 53 template <class T, std::size_t N> 54 struct rank_imp<T[], N> 55 { 56 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 57 }; 58 template <class T, std::size_t N> 59 struct rank_imp<T const[], N> 60 { 61 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 62 }; 63 template <class T, std::size_t N> 64 struct rank_imp<T volatile[], N> 65 { 66 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 67 }; 68 template <class T, std::size_t N> 69 struct rank_imp<T const volatile[], N> 70 { 71 BOOST_STATIC_CONSTANT(std::size_t, value = (::boost::detail::rank_imp<T, N+1>::value)); 72 }; 73 #endif 74 #endif 75 } 76 77 #endif // !defined( BOOST_CODEGEARC ) 78 79 #if defined( BOOST_CODEGEARC ) 80 template <class T> struct rank : public integral_constant<std::size_t, __array_rank(T)>{}; 81 #else 82 template <class T> struct rank : public integral_constant<std::size_t, (::boost::detail::rank_imp<T, 0>::value)>{}; 83 #endif 84 85 } // namespace boost 86 87 #endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED 88