blob: a03022133b020a9cc97ce3aae81577270d4087d7 [file] [log] [blame]
// 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