1 // Copyright David Abrahams 2002. 2 // Distributed under the Boost Software License, Version 1.0. (See 3 // accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 #ifndef INDIRECT_TRAITS_DWA2002131_HPP 6 # define INDIRECT_TRAITS_DWA2002131_HPP 7 # include <boost/type_traits/is_function.hpp> 8 # include <boost/type_traits/is_reference.hpp> 9 # include <boost/type_traits/is_pointer.hpp> 10 # include <boost/type_traits/is_class.hpp> 11 # include <boost/type_traits/is_const.hpp> 12 # include <boost/type_traits/is_volatile.hpp> 13 # include <boost/type_traits/is_member_function_pointer.hpp> 14 # include <boost/type_traits/is_member_pointer.hpp> 15 # include <boost/type_traits/remove_cv.hpp> 16 # include <boost/type_traits/remove_reference.hpp> 17 # include <boost/type_traits/remove_pointer.hpp> 18 19 # include <boost/detail/workaround.hpp> 20 21 # include <boost/mpl/eval_if.hpp> 22 # include <boost/mpl/if.hpp> 23 # include <boost/mpl/bool.hpp> 24 # include <boost/mpl/and.hpp> 25 # include <boost/mpl/not.hpp> 26 # include <boost/mpl/aux_/lambda_support.hpp> 27 28 29 namespace boost { namespace detail { 30 31 namespace indirect_traits { 32 33 template <class T> 34 struct is_reference_to_const : mpl::false_ 35 { 36 }; 37 38 template <class T> 39 struct is_reference_to_const<T const&> : mpl::true_ 40 { 41 }; 42 43 # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround 44 template<class T> 45 struct is_reference_to_const<T const volatile&> : mpl::true_ 46 { 47 }; 48 # endif 49 50 template <class T> 51 struct is_reference_to_function : mpl::false_ 52 { 53 }; 54 55 template <class T> 56 struct is_reference_to_function<T&> : is_function<T> 57 { 58 }; 59 60 template <class T> 61 struct is_pointer_to_function : mpl::false_ 62 { 63 }; 64 65 // There's no such thing as a pointer-to-cv-function, so we don't need 66 // specializations for those 67 template <class T> 68 struct is_pointer_to_function<T*> : is_function<T> 69 { 70 }; 71 72 template <class T> 73 struct is_reference_to_member_function_pointer_impl : mpl::false_ 74 { 75 }; 76 77 template <class T> 78 struct is_reference_to_member_function_pointer_impl<T&> 79 : is_member_function_pointer<typename remove_cv<T>::type> 80 { 81 }; 82 83 84 template <class T> 85 struct is_reference_to_member_function_pointer 86 : is_reference_to_member_function_pointer_impl<T> 87 { 88 BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T)) 89 }; 90 91 template <class T> 92 struct is_reference_to_function_pointer_aux 93 : mpl::and_< 94 is_reference<T> 95 , is_pointer_to_function< 96 typename remove_cv< 97 typename remove_reference<T>::type 98 >::type 99 > 100 > 101 { 102 // There's no such thing as a pointer-to-cv-function, so we don't need specializations for those 103 }; 104 105 template <class T> 106 struct is_reference_to_function_pointer 107 : mpl::if_< 108 is_reference_to_function<T> 109 , mpl::false_ 110 , is_reference_to_function_pointer_aux<T> 111 >::type 112 { 113 }; 114 115 template <class T> 116 struct is_reference_to_non_const 117 : mpl::and_< 118 is_reference<T> 119 , mpl::not_< 120 is_reference_to_const<T> 121 > 122 > 123 { 124 }; 125 126 template <class T> 127 struct is_reference_to_volatile : mpl::false_ 128 { 129 }; 130 131 template <class T> 132 struct is_reference_to_volatile<T volatile&> : mpl::true_ 133 { 134 }; 135 136 # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround 137 template <class T> 138 struct is_reference_to_volatile<T const volatile&> : mpl::true_ 139 { 140 }; 141 # endif 142 143 144 template <class T> 145 struct is_reference_to_pointer : mpl::false_ 146 { 147 }; 148 149 template <class T> 150 struct is_reference_to_pointer<T*&> : mpl::true_ 151 { 152 }; 153 154 template <class T> 155 struct is_reference_to_pointer<T* const&> : mpl::true_ 156 { 157 }; 158 159 template <class T> 160 struct is_reference_to_pointer<T* volatile&> : mpl::true_ 161 { 162 }; 163 164 template <class T> 165 struct is_reference_to_pointer<T* const volatile&> : mpl::true_ 166 { 167 }; 168 169 template <class T> 170 struct is_reference_to_class 171 : mpl::and_< 172 is_reference<T> 173 , is_class< 174 typename remove_cv< 175 typename remove_reference<T>::type 176 >::type 177 > 178 > 179 { 180 BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T)) 181 }; 182 183 template <class T> 184 struct is_pointer_to_class 185 : mpl::and_< 186 is_pointer<T> 187 , is_class< 188 typename remove_cv< 189 typename remove_pointer<T>::type 190 >::type 191 > 192 > 193 { 194 BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_class,(T)) 195 }; 196 197 198 } 199 200 using namespace indirect_traits; 201 202 }} // namespace boost::python::detail 203 204 #endif // INDIRECT_TRAITS_DWA2002131_HPP 205