SCM Repositories - boost


Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (download) (annotate)
Sat Dec 9 09:33:22 2006 UTC (2 years, 7 months ago) by johnmaddock
Branch: MAIN
CVS Tags: HEAD
Changes since 1.9: +3 -0 lines
Fix cv qualified pointer types so they are recognised as pointers.
    1 
    2 //  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes,
    3 //      Howard Hinnant and John Maddock 2000.
    4 //  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001
    5 
    6 //  Use, modification and distribution are subject to the Boost Software License,
    7 //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    8 //  http://www.boost.org/LICENSE_1_0.txt).
    9 //
   10 //  See http://www.boost.org/libs/type_traits for most recent version including documentation.
   11 
   12 //    Fixed is_pointer, is_reference, is_const, is_volatile, is_same,
   13 //    is_member_pointer based on the Simulated Partial Specialization work
   14 //    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or
   15 //    http://groups.yahoo.com/group/boost/message/5441
   16 //    Some workarounds in here use ideas suggested from "Generic<Programming>:
   17 //    Mappings between Types and Values"
   18 //    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).
   19 
   20 
   21 #ifndef BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
   22 #define BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
   23 
   24 #include <boost/type_traits/config.hpp>
   25 #include <boost/detail/workaround.hpp>
   26 
   27 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
   28 #   include <boost/type_traits/is_member_function_pointer.hpp>
   29 #else
   30 #   include <boost/type_traits/is_reference.hpp>
   31 #   include <boost/type_traits/is_array.hpp>
   32 #   include <boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>
   33 #   include <boost/type_traits/detail/yes_no_type.hpp>
   34 #   include <boost/type_traits/detail/false_result.hpp>
   35 #   include <boost/type_traits/detail/ice_or.hpp>
   36 #endif
   37 
   38 // should be the last #include
   39 #include <boost/type_traits/detail/bool_trait_def.hpp>
   40 
   41 namespace boost {
   42 
   43 #if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
   44 BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,false)
   45 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true)
   46 
   47 #elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
   48 BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,::boost::is_member_function_pointer<T>::value)
   49 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true)
   50 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const,true)
   51 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*volatile,true)
   52 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const volatile,true)
   53 
   54 #else // no partial template specialization
   55 
   56 namespace detail {
   57 
   58 template <typename R, typename T>
   59 ::boost::type_traits::yes_type BOOST_TT_DECL is_member_pointer_tester(R T::*const volatile*);
   60 ::boost::type_traits::no_type BOOST_TT_DECL is_member_pointer_tester(...);
   61 
   62 template <bool>
   63 struct is_member_pointer_select
   64     : ::boost::type_traits::false_result
   65 {
   66 };
   67 
   68 template <>
   69 struct is_member_pointer_select<false>
   70 {
   71     template <typename T> struct result_
   72     {
   73         static T* make_t();
   74         BOOST_STATIC_CONSTANT(
   75             bool, value =
   76             (::boost::type_traits::ice_or<
   77                 (1 == sizeof(::boost::type_traits::is_mem_fun_pointer_tester(make_t()))),
   78                 (1 == sizeof(is_member_pointer_tester(make_t())))
   79             >::value) );
   80     };
   81 };
   82 
   83 template <typename T>
   84 struct is_member_pointer_impl
   85     : is_member_pointer_select<
   86           ::boost::type_traits::ice_or<
   87               ::boost::is_reference<T>::value
   88             , ::boost::is_array<T>::value
   89             >::value
   90         >::template result_<T>
   91 {
   92 };
   93 
   94 BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void,false)
   95 #ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
   96 BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void const,false)
   97 BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void volatile,false)
   98 BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_pointer,void const volatile,false)
   99 #endif
  100 
  101 } // namespace detail
  102 
  103 BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,::boost::detail::is_member_pointer_impl<T>::value)
  104 
  105 #endif // __BORLANDC__
  106 
  107 } // namespace boost
  108 
  109 #include <boost/type_traits/detail/bool_trait_undef.hpp>
  110 
  111 #endif // BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED