blob: dfaef8d7e2e497226367ca8001d5c5758b652a35 [file] [log] [blame]
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2001-2011 Hartmut Kaiser
http://spirit.sourceforge.net/
Distributed under 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_SPIRIT_ACTION_DISPATCH_APRIL_18_2008_0720AM)
#define BOOST_SPIRIT_ACTION_DISPATCH_APRIL_18_2008_0720AM
#if defined(_MSC_VER)
#pragma once
#endif
#include <boost/spirit/home/phoenix/core/actor.hpp>
#include <boost/spirit/home/support/attributes.hpp>
namespace boost { namespace spirit { namespace traits
{
template <typename Component>
struct action_dispatch
{
// general handler for everything not explicitly specialized below
template <typename F, typename Attribute, typename Context>
bool operator()(F const& f, Attribute& attr, Context& context)
{
bool pass = true;
f(attr, context, pass);
return pass;
}
// handler for phoenix actors
// If the component this action has to be invoked for is a tuple, we
// wrap any non-fusion tuple into a fusion tuple (done by pass_attribute)
// and pass through any fusion tuple.
template <typename Eval, typename Attribute, typename Context>
bool operator()(phoenix::actor<Eval> const& f
, Attribute& attr, Context& context)
{
bool pass = true;
typename pass_attribute<Component, Attribute>::type attr_wrap(attr);
f(attr_wrap, context, pass);
return pass;
}
// specializations for plain function pointers taking different number of
// arguments
template <typename RT, typename A0, typename A1, typename A2
, typename Attribute, typename Context>
bool operator()(RT(*f)(A0, A1, A2), Attribute& attr, Context& context)
{
bool pass = true;
f(attr, context, pass);
return pass;
}
template <typename RT, typename A0, typename A1
, typename Attribute, typename Context>
bool operator()(RT(*f)(A0, A1), Attribute& attr, Context& context)
{
f(attr, context);
return true;
}
template <typename RT, typename A0, typename Attribute, typename Context>
bool operator()(RT(*f)(A0), Attribute& attr, Context&)
{
f(attr);
return true;
}
template <typename RT, typename Attribute, typename Context>
bool operator()(RT(*f)(), Attribute&, Context&)
{
f();
return true;
}
};
}}}
#endif