/*============================================================================= | |
Copyright (c) 2006-2007 Tobias Schwinger | |
Use modification and distribution are subject to the Boost Software | |
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
http://www.boost.org/LICENSE_1_0.txt). | |
==============================================================================*/ | |
#if !defined(BOOST_FUSION_FUNCTIONAL_ADAPTER_FUSED_FUNCTION_OBJECT_HPP_INCLUDED) | |
#define BOOST_FUSION_FUNCTIONAL_ADAPTER_FUSED_FUNCTION_OBJECT_HPP_INCLUDED | |
#include <boost/type_traits/add_reference.hpp> | |
#include <boost/config.hpp> | |
#include <boost/fusion/functional/adapter/detail/access.hpp> | |
#include <boost/fusion/functional/invocation/invoke_function_object.hpp> | |
#if defined (BOOST_MSVC) | |
# pragma warning(push) | |
# pragma warning (disable: 4512) // assignment operator could not be generated. | |
#endif | |
namespace boost { namespace fusion | |
{ | |
template <class Function> class fused_function_object; | |
//----- ---- --- -- - - - - | |
template <class Function> | |
class fused_function_object | |
{ | |
Function fnc_transformed; | |
typedef typename detail::qf_c<Function>::type & func_const_fwd_t; | |
typedef typename detail::qf<Function>::type & func_fwd_t; | |
public: | |
inline explicit fused_function_object(func_const_fwd_t f = Function()) | |
: fnc_transformed(f) | |
{ } | |
template <class Seq> | |
inline typename result_of::invoke_function_object<func_const_fwd_t, | |
Seq const>::type operator()(Seq const & s) const | |
{ | |
return fusion::invoke_function_object< | |
func_const_fwd_t >(this->fnc_transformed,s); | |
} | |
template <class Seq> | |
inline typename result_of::invoke_function_object<func_fwd_t, | |
Seq const>::type | |
operator()(Seq const & s) | |
{ | |
return fusion::invoke_function_object< | |
func_fwd_t >(this->fnc_transformed,s); | |
} | |
template <class Seq> | |
inline typename result_of::invoke_function_object<func_const_fwd_t, | |
Seq>::type | |
operator()(Seq & s) const | |
{ | |
return fusion::invoke_function_object< | |
func_const_fwd_t >(this->fnc_transformed,s); | |
} | |
template <class Seq> | |
inline typename result_of::invoke_function_object<func_fwd_t,Seq>::type | |
operator()(Seq & s) | |
{ | |
return fusion::invoke_function_object< | |
func_fwd_t >(this->fnc_transformed,s); | |
} | |
template <typename Sig> | |
struct result; | |
template <class Self, class Seq> | |
struct result< Self const (Seq) > | |
: result_of::invoke_function_object<func_const_fwd_t, | |
typename boost::remove_reference<Seq>::type > | |
{ }; | |
template <class Self, class Seq> | |
struct result< Self(Seq) > | |
: result_of::invoke_function_object<func_fwd_t, | |
typename boost::remove_reference<Seq>::type > | |
{ }; | |
}; | |
}} | |
#if defined (BOOST_MSVC) | |
# pragma warning(pop) | |
#endif | |
#endif | |