/* @Copyright Barrett Adair 2015-2017 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_CLBL_TRTS_DETAIL_FUNCTION_HPP #define BOOST_CLBL_TRTS_DETAIL_FUNCTION_HPP #include #include #include #include #include namespace boost { namespace callable_traits { namespace detail { template struct function : default_callable_traits {}; #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #ifndef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS volatile #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const volatile #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #ifndef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS & #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS && #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const & #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const && #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS volatile & #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS volatile && #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const volatile & #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const volatile && #include #undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS #endif // #ifndef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS #endif // #ifndef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS // function pointers #define BOOST_CLBL_TRTS_CC_TAG dummy #define BOOST_CLBL_TRTS_VARARGS_CC BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC #define BOOST_CLBL_TRTS_CC #define BOOST_CLBL_TRTS_ST #include #include #undef BOOST_CLBL_TRTS_ST #undef BOOST_CLBL_TRTS_CC #undef BOOST_CLBL_TRTS_CC_TAG #undef BOOST_CLBL_TRTS_VARARGS_CC /* ? #ifdef BOOST_CLBL_TRTS_ENABLE_CDECL #define BOOST_CLBL_TRTS_CC_TAG cdecl_tag #define BOOST_CLBL_TRTS_VARARGS_CC __cdecl #define BOOST_CLBL_TRTS_CC __cdecl #define BOOST_CLBL_TRTS_ST #include #undef BOOST_CLBL_TRTS_ST #undef BOOST_CLBL_TRTS_CC #undef BOOST_CLBL_TRTS_CC_TAG #undef BOOST_CLBL_TRTS_VARARGS_CC #endif*/ #ifdef BOOST_CLBL_TRTS_ENABLE_STDCALL #define BOOST_CLBL_TRTS_CC_TAG stdcall_tag #define BOOST_CLBL_TRTS_VARARGS_CC BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC #define BOOST_CLBL_TRTS_CC __stdcall #define BOOST_CLBL_TRTS_ST #include #undef BOOST_CLBL_TRTS_ST #undef BOOST_CLBL_TRTS_CC #undef BOOST_CLBL_TRTS_CC_TAG #undef BOOST_CLBL_TRTS_VARARGS_CC #endif #ifdef BOOST_CLBL_TRTS_ENABLE_FASTCALL #define BOOST_CLBL_TRTS_CC_TAG fastcall_tag #define BOOST_CLBL_TRTS_VARARGS_CC BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC #define BOOST_CLBL_TRTS_CC __fastcall #define BOOST_CLBL_TRTS_ST #include #undef BOOST_CLBL_TRTS_CC #undef BOOST_CLBL_TRTS_ST #undef BOOST_CLBL_TRTS_CC_TAG #undef BOOST_CLBL_TRTS_VARARGS_CC #endif #ifdef BOOST_CLBL_TRTS_ENABLE_PASCAL #define BOOST_CLBL_TRTS_CC_TAG pascal_tag #define BOOST_CLBL_TRTS_VARARGS_CC BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC #define BOOST_CLBL_TRTS_CC #define BOOST_CLBL_TRTS_ST pascal #include #undef BOOST_CLBL_TRTS_CC #undef BOOST_CLBL_TRTS_ST #undef BOOST_CLBL_TRTS_CC_TAG #undef BOOST_CLBL_TRTS_VARARGS_CC #endif template struct function : std::conditional::value, function, default_callable_traits>::type { static constexpr const bool value = !std::is_pointer::value; using traits = function; using base = function; using type = T&; using remove_varargs = typename base::remove_varargs&; using add_varargs = typename base::add_varargs&; using remove_member_reference = reference_error; using add_member_lvalue_reference = reference_error; using add_member_rvalue_reference = reference_error; using add_member_const = reference_error; using add_member_volatile = reference_error; using add_member_cv = reference_error; using remove_member_const = reference_error; using remove_member_volatile = reference_error; using remove_member_cv = reference_error; template using apply_return = typename base::template apply_return&; using clear_args = typename base::clear_args&; template using push_front = typename base::template push_front&; template using push_back = typename base::template push_back&; template using pop_back = typename base::template pop_back&; template using pop_front = typename base::template pop_front&; template using insert_args = typename base::template insert_args&; template using remove_args = typename base::template remove_args&; template using replace_args = typename base::template replace_args&; }; }}} // namespace boost::callable_traits::detail #endif // #ifndef BOOST_CLBL_TRTS_DETAIL_FUNCTION_HPP