1 | |
2 | // Copyright 2000 John Maddock ([email protected]) |
3 | // Copyright 2002 Aleksey Gurtovoy ([email protected]) |
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_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_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 | template <typename T> |
83 | struct is_function_impl<T&> : public false_type |
84 | {}; |
85 | #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES |
86 | template <typename T> |
87 | struct is_function_impl<T&&> : public false_type |
88 | {}; |
89 | #endif |
90 | |
91 | #endif |
92 | |
93 | } // namespace detail |
94 | |
95 | #endif // !defined( __CODEGEARC__ ) |
96 | |
97 | #if defined( __CODEGEARC__ ) |
98 | BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,__is_function(T)) |
99 | #else |
100 | BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,::boost::detail::is_function_impl<T>::value) |
101 | #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES |
102 | BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_function,T&&,false) |
103 | #endif |
104 | #endif |
105 | } // namespace boost |
106 | |
107 | #include <boost/type_traits/detail/bool_trait_undef.hpp> |
108 | |
109 | #endif // BOOST_TT_IS_FUNCTION_HPP_INCLUDED |
110 | |