/usr/include/boost/xpressive/detail/static
Edit: /usr/include/boost/xpressive/detail/static/visitor.hpp (4221B)
///////////////////////////////////////////////////////////////////////////////
// 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
#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