libstdc++
|
00001 // class template regex -*- C++ -*- 00002 00003 // Copyright (C) 2010-2013 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 3, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // Under Section 7 of GPL version 3, you are granted additional 00017 // permissions described in the GCC Runtime Library Exception, version 00018 // 3.1, as published by the Free Software Foundation. 00019 00020 // You should have received a copy of the GNU General Public License and 00021 // a copy of the GCC Runtime Library Exception along with this program; 00022 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 00023 // <http://www.gnu.org/licenses/>. 00024 00025 /** 00026 * @file bits/regex_grep_matcher.h 00027 * This is an internal header file, included by other library headers. 00028 * Do not attempt to use it directly. @headername{regex} 00029 */ 00030 00031 namespace std _GLIBCXX_VISIBILITY(default) 00032 { 00033 _GLIBCXX_BEGIN_NAMESPACE_VERSION 00034 00035 template<typename _BiIter> 00036 class sub_match; 00037 00038 template<typename _Bi_iter, typename _Allocator> 00039 class match_results; 00040 00041 _GLIBCXX_END_NAMESPACE_VERSION 00042 00043 namespace __detail 00044 { 00045 _GLIBCXX_BEGIN_NAMESPACE_VERSION 00046 00047 /** 00048 * @defgroup regex-detail Base and Implementation Classes 00049 * @ingroup regex 00050 * @{ 00051 */ 00052 00053 /// A _Results facade specialized for wrapping a templated match_results. 00054 template<typename _FwdIterT, typename _Alloc> 00055 class _SpecializedResults 00056 : public _Results 00057 { 00058 public: 00059 _SpecializedResults(const _Automaton::_SizeT __size, 00060 const _SpecializedCursor<_FwdIterT>& __cursor, 00061 match_results<_FwdIterT, _Alloc>& __m); 00062 00063 void 00064 _M_set_pos(int __i, int __j, const _PatternCursor& __pc); 00065 00066 void 00067 _M_set_matched(int __i, bool __is_matched) 00068 { _M_results.at(__i).matched = __is_matched; } 00069 00070 private: 00071 match_results<_FwdIterT, _Alloc>& _M_results; 00072 }; 00073 00074 template<typename _FwdIterT, typename _Alloc> 00075 _SpecializedResults<_FwdIterT, _Alloc>:: 00076 _SpecializedResults(const _Automaton::_SizeT __size, 00077 const _SpecializedCursor<_FwdIterT>& __cursor, 00078 match_results<_FwdIterT, _Alloc>& __m) 00079 : _M_results(__m) 00080 { 00081 _M_results.clear(); 00082 _M_results.reserve(__size + 2); 00083 _M_results.resize(__size); 00084 typename match_results<_FwdIterT, _Alloc>::value_type __sm; 00085 __sm.first = __sm.second = __cursor._M_begin(); 00086 _M_results.push_back(__sm); 00087 __sm.first = __sm.second = __cursor._M_end(); 00088 _M_results.push_back(__sm); 00089 } 00090 00091 template<typename _FwdIterT, typename _Alloc> 00092 void 00093 _SpecializedResults<_FwdIterT, _Alloc>:: 00094 _M_set_pos(int __i, int __j, const _PatternCursor& __pc) 00095 { 00096 typedef const _SpecializedCursor<_FwdIterT>& _CursorT; 00097 _CursorT __c = static_cast<_CursorT>(__pc); 00098 if (__j == 0) 00099 _M_results.at(__i).first = __c._M_pos(); 00100 else 00101 _M_results.at(__i).second = __c._M_pos()+1; 00102 } 00103 00104 /// A stack of states used in evaluating the NFA. 00105 typedef std::stack<_StateIdT, std::vector<_StateIdT> > _StateStack; 00106 00107 /// Executes a regular expression NFA/DFA over a range using a 00108 /// variant of the parallel execution algorithm featured in the grep 00109 /// utility, modified to use Laurikari tags. 00110 class _Grep_matcher 00111 { 00112 public: 00113 _Grep_matcher(_PatternCursor& __p, 00114 _Results& __r, 00115 const _AutomatonPtr& __automaton, 00116 regex_constants::match_flag_type __flags); 00117 00118 private: 00119 _StateSet 00120 _M_e_closure(_StateIdT __i); 00121 00122 _StateSet 00123 _M_e_closure(const _StateSet& __s); 00124 00125 _StateSet 00126 _M_e_closure(_StateStack& __stack, const _StateSet& __s); 00127 00128 const std::shared_ptr<_Nfa> _M_nfa; 00129 _PatternCursor& _M_pattern; 00130 _Results& _M_results; 00131 }; 00132 00133 //@} regex-detail 00134 _GLIBCXX_END_NAMESPACE_VERSION 00135 } // namespace __detail 00136 } // namespace std 00137 00138 #include <bits/regex_grep_matcher.tcc>