| /*============================================================================= |
| 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 |
| |