intrusive_ptr<finder<BidiIter> > optimize_regex ( xpression_peeker<typename iterator_value<BidiIter>::type> const &peeker , Traits const &traits , mpl::false_ ) { if(peeker.line_start()) { return intrusive_ptr<finder<BidiIter> > ( new line_start_finder<BidiIter, Traits>(traits) ); } 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> >(); }
intrusive_ptr<finder<BidiIter> > optimize_regex ( xpression_peeker<typename iterator_value<BidiIter>::type> const &peeker , Traits const &traits , 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_, traits, str.icase_) ); } return optimize_regex<BidiIter>(peeker, traits, mpl::false_()); }
virtual void peek(xpression_peeker<char_type> &peeker) const { peeker.fail(); }