123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487 |
- // Copyright David Abrahams 2002.
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef INDIRECT_TRAITS_DWA2002131_HPP
- # define INDIRECT_TRAITS_DWA2002131_HPP
- # include <boost/type_traits/is_function.hpp>
- # include <boost/type_traits/is_reference.hpp>
- # include <boost/type_traits/is_pointer.hpp>
- # include <boost/type_traits/is_class.hpp>
- # include <boost/type_traits/is_const.hpp>
- # include <boost/type_traits/is_volatile.hpp>
- # include <boost/type_traits/is_member_function_pointer.hpp>
- # include <boost/type_traits/is_member_pointer.hpp>
- # include <boost/type_traits/remove_cv.hpp>
- # include <boost/type_traits/remove_reference.hpp>
- # include <boost/type_traits/remove_pointer.hpp>
- # include <boost/type_traits/detail/ice_and.hpp>
- # include <boost/detail/workaround.hpp>
- # include <boost/mpl/eval_if.hpp>
- # include <boost/mpl/if.hpp>
- # include <boost/mpl/bool.hpp>
- # include <boost/mpl/and.hpp>
- # include <boost/mpl/not.hpp>
- # include <boost/mpl/aux_/lambda_support.hpp>
- # ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- # include <boost/detail/is_function_ref_tester.hpp>
- # endif
- namespace boost { namespace detail {
- namespace indirect_traits {
- # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- template <class T>
- struct is_reference_to_const : mpl::false_
- {
- };
- template <class T>
- struct is_reference_to_const<T const&> : mpl::true_
- {
- };
- # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround
- template<class T>
- struct is_reference_to_const<T const volatile&> : mpl::true_
- {
- };
- # endif
- template <class T>
- struct is_reference_to_function : mpl::false_
- {
- };
- template <class T>
- struct is_reference_to_function<T&> : is_function<T>
- {
- };
- template <class T>
- struct is_pointer_to_function : mpl::false_
- {
- };
- // There's no such thing as a pointer-to-cv-function, so we don't need
- // specializations for those
- template <class T>
- struct is_pointer_to_function<T*> : is_function<T>
- {
- };
- template <class T>
- struct is_reference_to_member_function_pointer_impl : mpl::false_
- {
- };
- template <class T>
- struct is_reference_to_member_function_pointer_impl<T&>
- : is_member_function_pointer<typename remove_cv<T>::type>
- {
- };
- template <class T>
- struct is_reference_to_member_function_pointer
- : is_reference_to_member_function_pointer_impl<T>
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T))
- };
- template <class T>
- struct is_reference_to_function_pointer_aux
- : mpl::and_<
- is_reference<T>
- , is_pointer_to_function<
- typename remove_cv<
- typename remove_reference<T>::type
- >::type
- >
- >
- {
- // There's no such thing as a pointer-to-cv-function, so we don't need specializations for those
- };
- template <class T>
- struct is_reference_to_function_pointer
- : mpl::if_<
- is_reference_to_function<T>
- , mpl::false_
- , is_reference_to_function_pointer_aux<T>
- >::type
- {
- };
- template <class T>
- struct is_reference_to_non_const
- : mpl::and_<
- is_reference<T>
- , mpl::not_<
- is_reference_to_const<T>
- >
- >
- {
- };
- template <class T>
- struct is_reference_to_volatile : mpl::false_
- {
- };
- template <class T>
- struct is_reference_to_volatile<T volatile&> : mpl::true_
- {
- };
- # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround
- template <class T>
- struct is_reference_to_volatile<T const volatile&> : mpl::true_
- {
- };
- # endif
- template <class T>
- struct is_reference_to_pointer : mpl::false_
- {
- };
- template <class T>
- struct is_reference_to_pointer<T*&> : mpl::true_
- {
- };
- template <class T>
- struct is_reference_to_pointer<T* const&> : mpl::true_
- {
- };
- template <class T>
- struct is_reference_to_pointer<T* volatile&> : mpl::true_
- {
- };
- template <class T>
- struct is_reference_to_pointer<T* const volatile&> : mpl::true_
- {
- };
- template <class T>
- struct is_reference_to_class
- : mpl::and_<
- is_reference<T>
- , is_class<
- typename remove_cv<
- typename remove_reference<T>::type
- >::type
- >
- >
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T))
- };
- template <class T>
- struct is_pointer_to_class
- : mpl::and_<
- is_pointer<T>
- , is_class<
- typename remove_cv<
- typename remove_pointer<T>::type
- >::type
- >
- >
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_class,(T))
- };
- # else
- using namespace boost::detail::is_function_ref_tester_;
- typedef char (&inner_yes_type)[3];
- typedef char (&inner_no_type)[2];
- typedef char (&outer_no_type)[1];
- template <typename V>
- struct is_const_help
- {
- typedef typename mpl::if_<
- is_const<V>
- , inner_yes_type
- , inner_no_type
- >::type type;
- };
- template <typename V>
- struct is_volatile_help
- {
- typedef typename mpl::if_<
- is_volatile<V>
- , inner_yes_type
- , inner_no_type
- >::type type;
- };
- template <typename V>
- struct is_pointer_help
- {
- typedef typename mpl::if_<
- is_pointer<V>
- , inner_yes_type
- , inner_no_type
- >::type type;
- };
- template <typename V>
- struct is_class_help
- {
- typedef typename mpl::if_<
- is_class<V>
- , inner_yes_type
- , inner_no_type
- >::type type;
- };
- template <class T>
- struct is_reference_to_function_aux
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value = sizeof(detail::is_function_ref_tester(t,0)) == sizeof(::boost::type_traits::yes_type));
- typedef mpl::bool_<value> type;
- };
- template <class T>
- struct is_reference_to_function
- : mpl::if_<is_reference<T>, is_reference_to_function_aux<T>, mpl::bool_<false> >::type
- {
- };
- template <class T>
- struct is_pointer_to_function_aux
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = sizeof(::boost::type_traits::is_function_ptr_tester(t)) == sizeof(::boost::type_traits::yes_type));
- typedef mpl::bool_<value> type;
- };
- template <class T>
- struct is_pointer_to_function
- : mpl::if_<is_pointer<T>, is_pointer_to_function_aux<T>, mpl::bool_<false> >::type
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_function,(T))
- };
- struct false_helper1
- {
- template <class T>
- struct apply : mpl::false_
- {
- };
- };
- template <typename V>
- typename is_const_help<V>::type reference_to_const_helper(V&);
- outer_no_type
- reference_to_const_helper(...);
- struct true_helper1
- {
- template <class T>
- struct apply
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = sizeof(reference_to_const_helper(t)) == sizeof(inner_yes_type));
- typedef mpl::bool_<value> type;
- };
- };
- template <bool ref = true>
- struct is_reference_to_const_helper1 : true_helper1
- {
- };
- template <>
- struct is_reference_to_const_helper1<false> : false_helper1
- {
- };
- template <class T>
- struct is_reference_to_const
- : is_reference_to_const_helper1<is_reference<T>::value>::template apply<T>
- {
- };
- template <bool ref = true>
- struct is_reference_to_non_const_helper1
- {
- template <class T>
- struct apply
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = sizeof(reference_to_const_helper(t)) == sizeof(inner_no_type));
-
- typedef mpl::bool_<value> type;
- };
- };
- template <>
- struct is_reference_to_non_const_helper1<false> : false_helper1
- {
- };
- template <class T>
- struct is_reference_to_non_const
- : is_reference_to_non_const_helper1<is_reference<T>::value>::template apply<T>
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_non_const,(T))
- };
- template <typename V>
- typename is_volatile_help<V>::type reference_to_volatile_helper(V&);
- outer_no_type
- reference_to_volatile_helper(...);
- template <bool ref = true>
- struct is_reference_to_volatile_helper1
- {
- template <class T>
- struct apply
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = sizeof(reference_to_volatile_helper(t)) == sizeof(inner_yes_type));
- typedef mpl::bool_<value> type;
- };
- };
- template <>
- struct is_reference_to_volatile_helper1<false> : false_helper1
- {
- };
- template <class T>
- struct is_reference_to_volatile
- : is_reference_to_volatile_helper1<is_reference<T>::value>::template apply<T>
- {
- };
- template <typename V>
- typename is_pointer_help<V>::type reference_to_pointer_helper(V&);
- outer_no_type reference_to_pointer_helper(...);
- template <class T>
- struct reference_to_pointer_impl
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = (sizeof((reference_to_pointer_helper)(t)) == sizeof(inner_yes_type))
- );
-
- typedef mpl::bool_<value> type;
- };
-
- template <class T>
- struct is_reference_to_pointer
- : mpl::eval_if<is_reference<T>, reference_to_pointer_impl<T>, mpl::false_>::type
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_pointer,(T))
- };
- template <class T>
- struct is_reference_to_function_pointer
- : mpl::eval_if<is_reference<T>, is_pointer_to_function_aux<T>, mpl::false_>::type
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_function_pointer,(T))
- };
- template <class T>
- struct is_member_function_pointer_help
- : mpl::if_<is_member_function_pointer<T>, inner_yes_type, inner_no_type>
- {};
- template <typename V>
- typename is_member_function_pointer_help<V>::type member_function_pointer_helper(V&);
- outer_no_type member_function_pointer_helper(...);
- template <class T>
- struct is_pointer_to_member_function_aux
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = sizeof((member_function_pointer_helper)(t)) == sizeof(inner_yes_type));
- typedef mpl::bool_<value> type;
- };
- template <class T>
- struct is_reference_to_member_function_pointer
- : mpl::if_<
- is_reference<T>
- , is_pointer_to_member_function_aux<T>
- , mpl::bool_<false>
- >::type
- {
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T))
- };
- template <typename V>
- typename is_class_help<V>::type reference_to_class_helper(V const volatile&);
- outer_no_type reference_to_class_helper(...);
- template <class T>
- struct is_reference_to_class
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = (is_reference<T>::value
- & (sizeof(reference_to_class_helper(t)) == sizeof(inner_yes_type)))
- );
- typedef mpl::bool_<value> type;
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T))
- };
- template <typename V>
- typename is_class_help<V>::type pointer_to_class_helper(V const volatile*);
- outer_no_type pointer_to_class_helper(...);
- template <class T>
- struct is_pointer_to_class
- {
- static T t;
- BOOST_STATIC_CONSTANT(
- bool, value
- = (is_pointer<T>::value
- && sizeof(pointer_to_class_helper(t)) == sizeof(inner_yes_type))
- );
- typedef mpl::bool_<value> type;
- };
- # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- }
- using namespace indirect_traits;
- }} // namespace boost::python::detail
- #endif // INDIRECT_TRAITS_DWA2002131_HPP
|