/////////////////////////////////////////////////////////////////////////////// // visitor.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_STATIC_PRODUCTIONS_VISITOR_HPP_EAN_10_04_2005 #define BOOST_XPRESSIVE_DETAIL_STATIC_PRODUCTIONS_VISITOR_HPP_EAN_10_04_2005 // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include #include #include #include #include #include namespace boost { namespace xpressive { namespace detail { /////////////////////////////////////////////////////////////////////////////// // template struct xpression_visitor_base { explicit xpression_visitor_base(shared_ptr > const &self) : impl_() , self_(self) { } void swap(xpression_visitor_base &that) { this->impl_.swap(that.impl_); this->self_.swap(that.self_); } int get_hidden_mark() { return -(int)(++this->impl_.hidden_mark_count_); } void mark_number(int mark_number) { if(0 < mark_number) { this->impl_.mark_count_ = (std::max)(this->impl_.mark_count_, (std::size_t)mark_number); } } shared_ptr > &self() { return this->self_; } regex_impl &impl() { return this->impl_; } protected: template void visit_(Matcher const &) { // no-op } template void visit_(regex_placeholder const &rex) { // when visiting an embedded regex, track the references this->impl_.track_reference(rex.impl_); } void visit_(mark_placeholder const &backref) { // keep track of the largest mark number found this->mark_number(backref.mark_number_); } void visit_(mark_begin_matcher const &mark_begin) { // keep track of the largest mark number found this->mark_number(mark_begin.mark_number_); } private: regex_impl impl_; shared_ptr > self_; }; /////////////////////////////////////////////////////////////////////////////// // template struct xpression_visitor : xpression_visitor_base { typedef BidiIter iterator_type; typedef ICase icase_type; typedef Traits traits_type; typedef typename boost::iterator_value::type char_type; explicit xpression_visitor(Traits const &tr, shared_ptr > const &self) : xpression_visitor_base(self) , traits_(tr) { } template struct apply { typedef typename transmogrify::type type; }; template typename apply::type call(Matcher const &matcher) { this->visit_(matcher); return transmogrify::call(matcher, *this); } Traits const &traits() const { return this->traits_; } private: Traits traits_; }; }}} #endif