///////////////////////////////////////////////////////////////////////////////
// flow_control.hpp
//
//  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_XPRESSIVE_DETAIL_CORE_FLOW_CONTROL_HPP_EAN_10_04_2005
#define BOOST_XPRESSIVE_DETAIL_CORE_FLOW_CONTROL_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/regex_impl.hpp>
#include <boost/xpressive/detail/core/state.hpp>
#include <boost/xpressive/detail/utility/ignore_unused.hpp>

namespace boost { namespace xpressive { namespace detail
{

///////////////////////////////////////////////////////////////////////////////
// push_context_match
//
template<typename BidiIter>
inline bool push_context_match
(
    regex_impl<BidiIter> const &impl
  , match_state<BidiIter> &state
  , matchable<BidiIter> const &next
)
{
    // avoid infinite recursion
    // BUGBUG this only catches direct infinite recursion, like sregex::compile("(?R)"), but
    // not indirect infinite recursion where two rules invoke each other recursively.
    if(state.is_active_regex(impl) && state.cur_ == state.sub_match(0).begin_)
    {
        return next.match(state);
    }

    // save state
    match_context<BidiIter> context = state.push_context(impl, next, context);
    detail::ignore_unused(context);

    // match the nested regex and uninitialize the match context
    // (reclaims the sub_match objects if necessary)
    return state.pop_context(impl, impl.xpr_->match(state));
}

///////////////////////////////////////////////////////////////////////////////
// pop_context_match
//
template<typename BidiIter>
inline bool pop_context_match(match_state<BidiIter> &state)
{
    // save state
    // BUGBUG nested regex could have changed state.traits_
    match_context<BidiIter> &context(*state.context_.prev_context_);
    state.swap_context(context);

    // Finished matching the nested regex; now match the rest of the enclosing regex
    bool success = context.next_ptr_->match(state);

    // restore state
    state.swap_context(context);
    return success;
}

}}} // namespace boost::xpressive::detail

#endif

