Home | History | Annotate | Download | only in type_traits
      1 
      2 //  Copyright 2000 John Maddock (john (at) johnmaddock.co.uk)
      3 //  Copyright 2002 Aleksey Gurtovoy (agurtovoy (at) meta-comm.com)
      4 //
      5 //  Use, modification and distribution are subject to the Boost Software License,
      6 //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
      7 //  http://www.boost.org/LICENSE_1_0.txt).
      8 //
      9 //  See http://www.boost.org/libs/type_traits for most recent version including documentation.
     10 
     11 #ifndef BOOST_TT_IS_FUNCTION_HPP_INCLUDED
     12 #define BOOST_TT_IS_FUNCTION_HPP_INCLUDED
     13 
     14 #include <boost/type_traits/is_reference.hpp>
     15 #include <boost/type_traits/detail/false_result.hpp>
     16 #include <boost/config.hpp>
     17 
     18 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
     19 #   include <boost/type_traits/detail/is_function_ptr_helper.hpp>
     20 #else
     21 #   include <boost/type_traits/detail/is_function_ptr_tester.hpp>
     22 #   include <boost/type_traits/detail/yes_no_type.hpp>
     23 #endif
     24 
     25 // should be the last #include
     26 #include <boost/type_traits/detail/bool_trait_def.hpp>
     27 
     28 // is a type a function?
     29 // Please note that this implementation is unnecessarily complex:
     30 // we could just use !is_convertible<T*, const volatile void*>::value,
     31 // except that some compilers erroneously allow conversions from
     32 // function pointers to void*.
     33 
     34 namespace boost {
     35 
     36 #if !defined( __CODEGEARC__ )
     37 
     38 namespace detail {
     39 
     40 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
     41 template<bool is_ref = true>
     42 struct is_function_chooser
     43     : public ::boost::type_traits::false_result
     44 {
     45 };
     46 
     47 template <>
     48 struct is_function_chooser<false>
     49 {
     50     template< typename T > struct result_
     51         : public ::boost::type_traits::is_function_ptr_helper<T*>
     52     {
     53     };
     54 };
     55 
     56 template <typename T>
     57 struct is_function_impl
     58     : public is_function_chooser< ::boost::is_reference<T>::value >
     59         ::BOOST_NESTED_TEMPLATE result_<T>
     60 {
     61 };
     62 
     63 #else
     64 
     65 template <typename T>
     66 struct is_function_impl
     67 {
     68 #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
     69 #pragma warning(push)
     70 #pragma warning(disable:6334)
     71 #endif
     72     static T* t;
     73     BOOST_STATIC_CONSTANT(
     74         bool, value = sizeof(::boost::type_traits::is_function_ptr_tester(t))
     75         == sizeof(::boost::type_traits::yes_type)
     76         );
     77 #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
     78 #pragma warning(pop)
     79 #endif
     80 };
     81 
     82 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
     83 template <typename T>
     84 struct is_function_impl<T&> : public false_type
     85 {};
     86 #endif
     87 
     88 #endif
     89 
     90 } // namespace detail
     91 
     92 #endif // !defined( __CODEGEARC__ )
     93 
     94 #if defined( __CODEGEARC__ )
     95 BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,__is_function(T))
     96 #else
     97 BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,::boost::detail::is_function_impl<T>::value)
     98 #ifndef BOOST_NO_RVALUE_REFERENCES
     99 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_function,T&&,false)
    100 #endif
    101 #endif
    102 } // namespace boost
    103 
    104 #include <boost/type_traits/detail/bool_trait_undef.hpp>
    105 
    106 #endif // BOOST_TT_IS_FUNCTION_HPP_INCLUDED
    107