/////////////////////////////////////////////////////////////////////////////// // visitor.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_STATIC_VISITOR_HPP_EAN_10_04_2005 #define BOOST_XPRESSIVE_DETAIL_STATIC_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) : self_(self) { } void swap(xpression_visitor_base &that) { this->self_.swap(that.self_); } int get_hidden_mark() { return -(int)(++this->self_->hidden_mark_count_); } void mark_number(int mark_nbr) { if(0 < mark_nbr) { this->self_->mark_count_ = (std::max)(this->self_->mark_count_, (std::size_t)mark_nbr); } } shared_ptr > &self() { return this->self_; } protected: template void visit_(Matcher const &) { } void visit_(reference_wrapper > const &rex) { // when visiting an embedded regex, track the references this->self_->track_reference(*detail::core_access::get_regex_impl(rex.get())); } void visit_(reference_wrapper const> const &rex) { // when visiting an embedded regex, track the references this->self_->track_reference(*detail::core_access::get_regex_impl(rex.get())); } void visit_(tracking_ptr > const &rex) { // when visiting an embedded regex, track the references this->self_->track_reference(*rex.get()); } 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: 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