123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- ///////////////////////////////////////////////////////////////////////////////
- // 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)
- # pragma once
- #endif
- #include <boost/ref.hpp>
- #include <boost/shared_ptr.hpp>
- #include <boost/xpressive/detail/detail_fwd.hpp>
- #include <boost/xpressive/detail/core/regex_impl.hpp>
- #include <boost/xpressive/detail/static/transmogrify.hpp>
- #include <boost/xpressive/detail/core/matcher/mark_begin_matcher.hpp>
- namespace boost { namespace xpressive { namespace detail
- {
- ///////////////////////////////////////////////////////////////////////////////
- //
- template<typename BidiIter>
- struct xpression_visitor_base
- {
- explicit xpression_visitor_base(shared_ptr<regex_impl<BidiIter> > const &self)
- : self_(self)
- {
- }
- void swap(xpression_visitor_base<BidiIter> &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<regex_impl<BidiIter> > &self()
- {
- return this->self_;
- }
- protected:
- template<typename Matcher>
- void visit_(Matcher const &)
- {
- }
- void visit_(reference_wrapper<basic_regex<BidiIter> > const &rex)
- {
- // when visiting an embedded regex, track the references
- this->self_->track_reference(*detail::core_access<BidiIter>::get_regex_impl(rex.get()));
- }
- void visit_(reference_wrapper<basic_regex<BidiIter> const> const &rex)
- {
- // when visiting an embedded regex, track the references
- this->self_->track_reference(*detail::core_access<BidiIter>::get_regex_impl(rex.get()));
- }
- void visit_(tracking_ptr<regex_impl<BidiIter> > 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<regex_impl<BidiIter> > self_;
- };
- ///////////////////////////////////////////////////////////////////////////////
- //
- template<typename BidiIter, typename ICase, typename Traits>
- struct xpression_visitor
- : xpression_visitor_base<BidiIter>
- {
- typedef BidiIter iterator_type;
- typedef ICase icase_type;
- typedef Traits traits_type;
- typedef typename boost::iterator_value<BidiIter>::type char_type;
- explicit xpression_visitor(Traits const &tr, shared_ptr<regex_impl<BidiIter> > const &self)
- : xpression_visitor_base<BidiIter>(self)
- , traits_(tr)
- {
- }
- template<typename Matcher>
- struct apply
- {
- typedef typename transmogrify<BidiIter, ICase, Traits, Matcher>::type type;
- };
- template<typename Matcher>
- typename apply<Matcher>::type
- call(Matcher const &matcher)
- {
- this->visit_(matcher);
- return transmogrify<BidiIter, ICase, Traits, Matcher>::call(matcher, *this);
- }
- Traits const &traits() const
- {
- return this->traits_;
- }
- private:
- Traits traits_;
- };
- }}}
- #endif
|