diff options
Diffstat (limited to 'boost/callable_traits/detail/function.hpp')
-rw-r--r-- | boost/callable_traits/detail/function.hpp | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/boost/callable_traits/detail/function.hpp b/boost/callable_traits/detail/function.hpp new file mode 100644 index 0000000000..624c704d20 --- /dev/null +++ b/boost/callable_traits/detail/function.hpp @@ -0,0 +1,192 @@ +/* + +@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 <boost/callable_traits/detail/config.hpp> +#include <boost/callable_traits/detail/qualifier_flags.hpp> +#include <boost/callable_traits/detail/forward_declarations.hpp> +#include <boost/callable_traits/detail/set_function_qualifiers.hpp> +#include <boost/callable_traits/detail/default_callable_traits.hpp> + +namespace boost { namespace callable_traits { namespace detail { + +template<typename T> +struct function : default_callable_traits<T> {}; + +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#ifndef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS volatile +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const volatile +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#ifndef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS & +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS && +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const & +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const && +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS volatile & +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS volatile && +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const volatile & +#include <boost/callable_traits/detail/unguarded/function.hpp> +#undef BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + +#define BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS const volatile && +#include <boost/callable_traits/detail/unguarded/function.hpp> +#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 <boost/callable_traits/detail/unguarded/function_ptr.hpp> +#include <boost/callable_traits/detail/unguarded/function_ptr_varargs.hpp> +#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 <boost/callable_traits/detail/unguarded/function_ptr.hpp> +#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 <boost/callable_traits/detail/unguarded/function_ptr.hpp> +#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 <boost/callable_traits/detail/unguarded/function_ptr.hpp> +#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 <boost/callable_traits/detail/unguarded/function_ptr.hpp> +#undef BOOST_CLBL_TRTS_CC +#undef BOOST_CLBL_TRTS_ST +#undef BOOST_CLBL_TRTS_CC_TAG +#undef BOOST_CLBL_TRTS_VARARGS_CC +#endif + +template<typename T> +struct function<T&> : std::conditional<function<T>::value, + function<T>, default_callable_traits<T&>>::type { + + static constexpr const bool value = !std::is_pointer<T>::value; + + using traits = function; + using base = function<T>; + 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<typename NewReturn> + using apply_return = typename base::template apply_return<NewReturn>&; + + using clear_args = typename base::clear_args&; + + template<typename... NewArgs> + using push_front = typename base::template push_front<NewArgs...>&; + + template<typename... NewArgs> + using push_back = typename base::template push_back<NewArgs...>&; + + template<std::size_t Count> + using pop_back = typename base::template pop_back<Count>&; + + template<std::size_t Count> + using pop_front = typename base::template pop_front<Count>&; + + template<std::size_t Index, typename... NewArgs> + using insert_args = typename base::template insert_args<Index, NewArgs...>&; + + template<std::size_t Index, std::size_t Count> + using remove_args = typename base::template remove_args<Index, Count>&; + + template<std::size_t Index, typename... NewArgs> + using replace_args = typename base::template replace_args<Index, NewArgs...>&; +}; + +}}} // namespace boost::callable_traits::detail + +#endif // #ifndef BOOST_CLBL_TRTS_DETAIL_FUNCTION_HPP |