123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- ///////////////////////////////////////////////////////////////////////////////
- // optimize.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_OPTIMIZE_HPP_EAN_10_04_2005
- #define BOOST_XPRESSIVE_DETAIL_CORE_OPTIMIZE_HPP_EAN_10_04_2005
- #include <string>
- #include <utility>
- #include <boost/mpl/bool.hpp>
- #include <boost/intrusive_ptr.hpp>
- #include <boost/iterator/iterator_traits.hpp>
- #include <boost/xpressive/detail/core/finder.hpp>
- #include <boost/xpressive/detail/core/linker.hpp>
- #include <boost/xpressive/detail/core/peeker.hpp>
- #include <boost/xpressive/detail/core/regex_impl.hpp>
- namespace boost { namespace xpressive { namespace detail
- {
- ///////////////////////////////////////////////////////////////////////////////
- // optimize_regex
- //
- template<typename BidiIter, typename Traits>
- intrusive_ptr<finder<BidiIter> > optimize_regex
- (
- xpression_peeker<typename iterator_value<BidiIter>::type> const &peeker
- , Traits const &tr
- , mpl::false_
- )
- {
- if(peeker.line_start())
- {
- return intrusive_ptr<finder<BidiIter> >
- (
- new line_start_finder<BidiIter, Traits>(tr)
- );
- }
- else if(peeker.leading_simple_repeat())
- {
- return intrusive_ptr<finder<BidiIter> >
- (
- new leading_simple_repeat_finder<BidiIter>()
- );
- }
- else if(256 != peeker.bitset().count())
- {
- return intrusive_ptr<finder<BidiIter> >
- (
- new hash_peek_finder<BidiIter, Traits>(peeker.bitset())
- );
- }
- return intrusive_ptr<finder<BidiIter> >();
- }
- ///////////////////////////////////////////////////////////////////////////////
- // optimize_regex
- //
- template<typename BidiIter, typename Traits>
- intrusive_ptr<finder<BidiIter> > optimize_regex
- (
- xpression_peeker<typename iterator_value<BidiIter>::type> const &peeker
- , Traits const &tr
- , mpl::true_
- )
- {
- typedef typename iterator_value<BidiIter>::type char_type;
- // if we have a leading string literal, initialize a boyer-moore struct with it
- peeker_string<char_type> const &str = peeker.get_string();
- if(str.begin_ != str.end_)
- {
- BOOST_ASSERT(1 == peeker.bitset().count());
- return intrusive_ptr<finder<BidiIter> >
- (
- new boyer_moore_finder<BidiIter, Traits>(str.begin_, str.end_, tr, str.icase_)
- );
- }
- return optimize_regex<BidiIter>(peeker, tr, mpl::false_());
- }
- ///////////////////////////////////////////////////////////////////////////////
- // common_compile
- //
- template<typename BidiIter, typename Traits>
- void common_compile
- (
- intrusive_ptr<matchable_ex<BidiIter> const> const ®ex
- , regex_impl<BidiIter> &impl
- , Traits const &tr
- )
- {
- typedef typename iterator_value<BidiIter>::type char_type;
- // "link" the regex
- xpression_linker<char_type> linker(tr);
- regex->link(linker);
- // "peek" into the compiled regex to see if there are optimization opportunities
- hash_peek_bitset<char_type> bset;
- xpression_peeker<char_type> peeker(bset, tr, linker.has_backrefs());
- regex->peek(peeker);
- // optimization: get the peek chars OR the boyer-moore search string
- impl.finder_ = optimize_regex<BidiIter>(peeker, tr, is_random<BidiIter>());
- impl.xpr_ = regex;
- }
- }}} // namespace boost::xpressive
- #endif
|