#ifndef BOOST_CONTRACT_DETAIL_MEMBER_FUNCTION_TYPES_HPP_ #define BOOST_CONTRACT_DETAIL_MEMBER_FUNCTION_TYPES_HPP_ // Copyright (C) 2008-2018 Lorenzo Caminiti // Distributed under the Boost Software License, Version 1.0 (see accompanying // file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt). // See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace contract { class virtual_; } } namespace boost { namespace contract { namespace detail { template struct member_function_types { typedef typename boost::function_types::result_type::type result_type; // Never include leading class type. typedef typename boost::mpl::pop_front::type>::type argument_types; // Always include trailing virtual_* type. typedef typename boost::mpl::if_::type, boost::contract::virtual_*>, boost::mpl::identity , boost::mpl::push_back >::type::type virtual_argument_types; typedef typename boost::mpl::if_, boost::is_volatile >, boost::function_types::cv_qualified , typename boost::mpl::if_, boost::function_types::const_non_volatile , typename boost::mpl::if_, boost::function_types::volatile_non_const , boost::function_types::null_tag >::type>::type>::type property_tag; }; // Also handles none type. template struct member_function_types { typedef none result_type; typedef none argument_types; typedef none virtual_argument_types; typedef none property_tag; }; } } } // namespace #endif // #include guard