// Copyright 2008 Christophe Henry | |
// henry UNDERSCORE christophe AT hotmail DOT com | |
// This is taken from Boost.Proto's documentation | |
// Copyright for the original version: | |
// Copyright 2008 Eric Niebler. 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) | |
#ifndef BOOST_MSM_BACK_FOLD_TO_LIST_H | |
#define BOOST_MSM_BACK_FOLD_TO_LIST_H | |
#include <boost/msm/proto_config.hpp> | |
#include <boost/proto/core.hpp> | |
#include <boost/proto/transform.hpp> | |
#include <boost/fusion/container/list/cons.hpp> | |
namespace boost { namespace msm { namespace back | |
{ | |
struct state_copy_tag | |
{ | |
}; | |
::boost::proto::terminal<state_copy_tag>::type const states_={{}}; | |
struct FoldToList | |
: ::boost::proto::or_< | |
// Don't add the states_ terminal to the list | |
::boost::proto::when< | |
::boost::proto::terminal< state_copy_tag > | |
, ::boost::proto::_state | |
> | |
// Put all other terminals at the head of the | |
// list that we're building in the "state" parameter | |
, ::boost::proto::when< | |
::boost::proto::terminal< ::boost::proto::_> | |
, boost::fusion::cons< ::boost::proto::_value, ::boost::proto::_state>( | |
::boost::proto::_value, ::boost::proto::_state | |
) | |
> | |
// For left-shift operations, first fold the right | |
// child to a list using the current state. Use | |
// the result as the state parameter when folding | |
// the left child to a list. | |
, ::boost::proto::when< | |
::boost::proto::shift_left<FoldToList, FoldToList> | |
, FoldToList( | |
::boost::proto::_left | |
, ::boost::proto::call<FoldToList( ::boost::proto::_right, ::boost::proto::_state )> | |
) | |
> | |
> | |
{}; | |
}}} | |
#endif //BOOST_MSM_BACK_FOLD_TO_LIST_H | |