boost/contract/detail/type_traits/member_function_types.hpp
#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 <boost/contract/detail/none.hpp>
#include <boost/function_types/parameter_types.hpp>
#include <boost/function_types/result_type.hpp>
#include <boost/function_types/property_tags.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_volatile.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/pop_front.hpp>
#include <boost/mpl/push_back.hpp>
#include <boost/mpl/back.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/identity.hpp>
namespace boost {
namespace contract {
class virtual_;
}
}
namespace boost { namespace contract { namespace detail {
template<class C, typename F>
struct member_function_types {
typedef typename boost::function_types::result_type<F>::type result_type;
// Never include leading class type.
typedef typename boost::mpl::pop_front<typename boost::function_types::
parameter_types<F>::type>::type argument_types;
// Always include trailing virtual_* type.
typedef typename boost::mpl::if_<boost::is_same<typename boost::
mpl::back<argument_types>::type, boost::contract::virtual_*>,
boost::mpl::identity<argument_types>
,
boost::mpl::push_back<argument_types, boost::contract::virtual_*>
>::type::type virtual_argument_types;
typedef typename boost::mpl::if_<boost::mpl::and_<boost::is_const<C>,
boost::is_volatile<C> >,
boost::function_types::cv_qualified
, typename boost::mpl::if_<boost::is_const<C>,
boost::function_types::const_non_volatile
, typename boost::mpl::if_<boost::is_volatile<C>,
boost::function_types::volatile_non_const
,
boost::function_types::null_tag
>::type>::type>::type property_tag;
};
// Also handles none type.
template<class C>
struct member_function_types<C, none> {
typedef none result_type;
typedef none argument_types;
typedef none virtual_argument_types;
typedef none property_tag;
};
} } } // namespace
#endif // #include guard