1 // class template regex -*- C++ -*- 2 3 // Copyright (C) 2010, 2011 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** 26 * @file bits/regex_grep_matcher.h 27 * This is an internal header file, included by other library headers. 28 * Do not attempt to use it directly. @headername{regex} 29 */ 30 31 namespace std _GLIBCXX_VISIBILITY(default) 32 { 33 _GLIBCXX_BEGIN_NAMESPACE_VERSION 34 35 template<typename _BiIter> 36 class sub_match; 37 38 template<typename _Bi_iter, typename _Allocator> 39 class match_results; 40 41 _GLIBCXX_END_NAMESPACE_VERSION 42 43 namespace __regex 44 { 45 _GLIBCXX_BEGIN_NAMESPACE_VERSION 46 47 // A _Results facade specialized for wrapping a templated match_results. 48 template<typename _FwdIterT, typename _Alloc> 49 class _SpecializedResults 50 : public _Results 51 { 52 public: 53 _SpecializedResults(const _Automaton::_SizeT __size, 54 const _SpecializedCursor<_FwdIterT>& __cursor, 55 match_results<_FwdIterT, _Alloc>& __m); 56 57 void 58 _M_set_pos(int __i, int __j, const _PatternCursor& __pc); 59 60 void 61 _M_set_matched(int __i, bool __is_matched) 62 { _M_results.at(__i).matched = __is_matched; } 63 64 private: 65 match_results<_FwdIterT, _Alloc>& _M_results; 66 }; 67 68 template<typename _FwdIterT, typename _Alloc> 69 _SpecializedResults<_FwdIterT, _Alloc>:: 70 _SpecializedResults(const _Automaton::_SizeT __size, 71 const _SpecializedCursor<_FwdIterT>& __cursor, 72 match_results<_FwdIterT, _Alloc>& __m) 73 : _M_results(__m) 74 { 75 _M_results.clear(); 76 _M_results.reserve(__size + 2); 77 _M_results.resize(__size); 78 typename match_results<_FwdIterT, _Alloc>::value_type __sm; 79 __sm.first = __sm.second = __cursor._M_begin(); 80 _M_results.push_back(__sm); 81 __sm.first = __sm.second = __cursor._M_end(); 82 _M_results.push_back(__sm); 83 } 84 85 template<typename _FwdIterT, typename _Alloc> 86 void 87 _SpecializedResults<_FwdIterT, _Alloc>:: 88 _M_set_pos(int __i, int __j, const _PatternCursor& __pc) 89 { 90 typedef const _SpecializedCursor<_FwdIterT>& _CursorT; 91 _CursorT __c = static_cast<_CursorT>(__pc); 92 if (__j == 0) 93 _M_results.at(__i).first = __c._M_pos(); 94 else 95 _M_results.at(__i).second = __c._M_pos()+1; 96 } 97 98 // A stack of states used in evaluating the NFA. 99 typedef std::stack<_StateIdT, std::vector<_StateIdT> > _StateStack; 100 101 // Executes a regular expression NFA/DFA over a range using a variant of 102 // the parallel execution algorithm featured in the grep utility, modified 103 // to use Laurikari tags. 104 class _Grep_matcher 105 { 106 public: 107 _Grep_matcher(_PatternCursor& __p, 108 _Results& __r, 109 const _AutomatonPtr& __automaton, 110 regex_constants::match_flag_type __flags); 111 112 private: 113 _StateSet 114 _M_e_closure(_StateIdT __i); 115 116 _StateSet 117 _M_e_closure(const _StateSet& __s); 118 119 _StateSet 120 _M_e_closure(_StateStack& __stack, const _StateSet& __s); 121 122 private: 123 const std::shared_ptr<_Nfa> _M_nfa; 124 _PatternCursor& _M_pattern; 125 _Results& _M_results; 126 }; 127 128 _GLIBCXX_END_NAMESPACE_VERSION 129 } // namespace __regex 130 } // namespace 131 132 #include <bits/regex_grep_matcher.tcc> 133