boost/xpressive/detail/core/matcher/action_matcher.hpp
/////////////////////////////////////////////////////////////////////////////// // action_matcher.hpp // // Copyright 2004 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_XPRESSIVE_DETAIL_CORE_MATCHER_ACTION_MATCHER_HPP_EAN_10_04_2005 #define BOOST_XPRESSIVE_DETAIL_CORE_MATCHER_ACTION_MATCHER_HPP_EAN_10_04_2005 // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include <boost/xpressive/detail/detail_fwd.hpp> #include <boost/xpressive/detail/core/access.hpp> #include <boost/xpressive/detail/core/quant_style.hpp> #include <boost/xpressive/detail/core/state.hpp> namespace boost { namespace xpressive { namespace detail { /////////////////////////////////////////////////////////////////////////////// // action_matcher // template<typename Action> struct action_matcher : quant_style<quant_none, mpl::size_t<0>, mpl::false_> { Action *action_ptr_; action_matcher() : action_ptr_(&action_()) { } action_matcher(action_matcher const &) : action_ptr_(&action_()) { } action_matcher &operator =(action_matcher const &) { return *this; // no-op } template<typename BidiIter, typename Next> bool match(state_type<BidiIter> &state, Next const &next) const { Action &action = *this->action_ptr_; typename Action::saved_type saved(action.save()); // set the action state pointer, so that action_state_cast works correctly core_access<BidiIter>::get_action_state(*state.context_.results_ptr_) = state.action_state_; match_results<BidiIter> const &what = *state.context_.results_ptr_; if(!action(what, state.cur_) || !next.match(state)) { action.restore(saved); return false; } return true; } protected: Action &action_() { return *static_cast<Action *>(this); } }; }}} #endif