diff options
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/regex.h | 17 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex_compiler.h | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex_executor.h | 19 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex_executor.tcc | 3 |
4 files changed, 24 insertions, 17 deletions
diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 48388198ce0..412465adfa2 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -880,8 +880,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION assign(const basic_string<_Ch_type, _Ch_typeraits, _Alloc>& __s, flag_type __flags = ECMAScript) { - basic_regex __tmp(__s, __flags); - this->swap(__tmp); + _M_flags = __flags; + _M_automaton = + __detail::_Compiler<decltype(__s.begin()), _Ch_type, _Rx_traits> + (__s.begin(), __s.end(), _M_traits, _M_flags)._M_get_nfa(); return *this; } @@ -2591,7 +2593,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION regex_constants::match_flag_type __m = regex_constants::match_default) : _M_begin(__a), _M_end(__b), _M_pregex(&__re), _M_flags(__m), _M_match() - { regex_search(_M_begin, _M_end, _M_match, *_M_pregex, _M_flags); } + { + if (!regex_search(_M_begin, _M_end, _M_match, *_M_pregex, _M_flags)) + *this = regex_iterator(); + } /** * Copy constructs a %regex_iterator. @@ -2905,9 +2910,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return (*_M_position)[_M_subs[_M_n]]; } - bool - _M_end_of_seq() const - { return _M_result != nullptr; } + constexpr bool + _M_end_of_seq() + { return _M_result == nullptr; } _Position _M_position; const value_type* _M_result; diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h index 1d588b91df8..a1107bb7eeb 100644 --- a/libstdc++-v3/include/bits/regex_compiler.h +++ b/libstdc++-v3/include/bits/regex_compiler.h @@ -214,7 +214,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return _M_traits.transform(__s.begin(), __s.end()); } - _TraitsT _M_traits; + const _TraitsT& _M_traits; _FlagT _M_flags; bool _M_is_non_matching; std::vector<_CharT> _M_char_set; diff --git a/libstdc++-v3/include/bits/regex_executor.h b/libstdc++-v3/include/bits/regex_executor.h index 23998ed064d..6d66d881584 100644 --- a/libstdc++-v3/include/bits/regex_executor.h +++ b/libstdc++-v3/include/bits/regex_executor.h @@ -120,13 +120,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef typename _BaseT::_ResultsVec _ResultsVec; typedef regex_constants::match_flag_type _FlagT; - _DFSExecutor(_BiIter __begin, - _BiIter __end, - _ResultsT& __results, - const _RegexT& __nfa, - _FlagT __flags) + _DFSExecutor(_BiIter __begin, + _BiIter __end, + _ResultsT& __results, + const _RegexT& __nfa, + const _TraitsT& __traits, + _FlagT __flags) : _BaseT(__begin, __end, __results, __flags, __nfa._M_sub_count()), - _M_traits(_TraitsT()), _M_nfa(__nfa), _M_results_ret(this->_M_results) + _M_traits(__traits), _M_nfa(__nfa), _M_results_ret(this->_M_results) { } void @@ -142,9 +143,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _M_dfs(_StateIdT __i); - _ResultsVec _M_results_ret; - _TraitsT _M_traits; - const _RegexT& _M_nfa; + _ResultsVec _M_results_ret; + const _TraitsT& _M_traits; + const _RegexT& _M_nfa; }; // Like the DFS approach, it try every possible state transition; Unlike DFS, diff --git a/libstdc++-v3/include/bits/regex_executor.tcc b/libstdc++-v3/include/bits/regex_executor.tcc index edfd0b649ff..788d65e54de 100644 --- a/libstdc++-v3/include/bits/regex_executor.tcc +++ b/libstdc++-v3/include/bits/regex_executor.tcc @@ -320,7 +320,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION auto __p = std::static_pointer_cast<_NFA<_CharT, _TraitsT>> (__re._M_automaton); if (__p->_M_has_backref) - return _ExecutorPtr(new _DFSExecutorT(__b, __e, __m, *__p, __flags)); + return _ExecutorPtr(new _DFSExecutorT(__b, __e, __m, *__p, + __re._M_traits, __flags)); return _ExecutorPtr(new _BFSExecutorT(__b, __e, __m, *__p, __flags)); } |