diff options
author | timshen <timshen@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-29 18:33:07 +0000 |
---|---|---|
committer | timshen <timshen@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-29 18:33:07 +0000 |
commit | 8cf691c41f48b629e9bf6d96e277852f242861e9 (patch) | |
tree | 47953718d312ebb6f609c71919a39de4a22c5f23 | |
parent | b3521e4b13778020b7c1c6f09421f8cb983f9dd0 (diff) | |
download | ppe42-gcc-8cf691c41f48b629e9bf6d96e277852f242861e9.tar.gz ppe42-gcc-8cf691c41f48b629e9bf6d96e277852f242861e9.zip |
2013-08-29 Tim Shen <timshen91@gmail.com>
* include/bits/regex.h (basic_regex<>::assign): Don't lose _M_traits.
(regex_iterator<>::regex_iterator): Return nullptr when regex_search
failed.
(regex_token_iterator<>::_M_end_of_seq): Should be defined true when
_M_result is(not isn't) nullptr.
* include/bits/regex_compiler.h: Store _Compiler::_M_traits by reference
instead of by value.
* include/bits/regex_executor.h (_DFSExecutor<>::_DFSExecutor): Add
_M_traits to _DFSExecutor.
* include/bits/regex_executor.tcc (__get_executor<>): Pass traits to
_DFSExecutor too.
* testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc:
New.
* testsuite/28_regex/iterators/regex_token_iterator/wchar_t/
wstring_02.cc: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202082 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/ChangeLog | 18 | ||||
-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 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc | 48 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/wchar_t/wstring_02.cc | 53 |
7 files changed, 143 insertions, 17 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 866156686d3..90f68ae86be 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,21 @@ +2013-08-29 Tim Shen <timshen91@gmail.com> + + * include/bits/regex.h (basic_regex<>::assign): Don't lose _M_traits. + (regex_iterator<>::regex_iterator): Return nullptr when regex_search + failed. + (regex_token_iterator<>::_M_end_of_seq): Should be defined true when + _M_result is(not isn't) nullptr. + * include/bits/regex_compiler.h: Store _Compiler::_M_traits by reference + instead of by value. + * include/bits/regex_executor.h (_DFSExecutor<>::_DFSExecutor): Add + _M_traits to _DFSExecutor. + * include/bits/regex_executor.tcc (__get_executor<>): Pass traits to + _DFSExecutor too. + * testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc: + New. + * testsuite/28_regex/iterators/regex_token_iterator/wchar_t/ + wstring_02.cc: New. + 2013-08-26 Tim Shen <timshen91@gmail.com> * include/Makefile.am: Add regex_scanner.{h,tcc}. 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)); } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc new file mode 100644 index 00000000000..6ab48ca6baf --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc @@ -0,0 +1,48 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-namedlocale "de_DE.UTF-8" } + +// +// 2013-08-29 Tim Shen <timshen91@gmail.com> +// +// Copyright (C) 2013 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// 28.11.2 regex_match +// Tests Extended localization against a wide-string. + +#include <regex> +#include <testsuite_hooks.h> + +void +test01() +{ + bool test __attribute__((unused)) = true; + + std::wstring str2 = L"ÜBER"; + std::wregex re2; + re2.imbue(std::locale("de_DE.UTF-8")); + re2.assign(L"[[:upper:]]*", std::regex::extended); + std::wsmatch m2; + VERIFY(std::regex_match(str2, m2, re2)); +} + +int +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/wchar_t/wstring_02.cc b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/wchar_t/wstring_02.cc new file mode 100644 index 00000000000..0306ee197b9 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/wchar_t/wstring_02.cc @@ -0,0 +1,53 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-namedlocale "en_US.UTF-8" } + +// +// 2013-08-29 Tim Shen <timshen91@gmail.com> +// +// Copyright (C) 2013 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// 28.12.2 regex_token_iterator +// Tests regex_token_iterator class over a localized wstring. + +#include <regex> +#include <testsuite_hooks.h> + +void +test01() +{ + bool test __attribute__((unused)) = true; + + std::setlocale(LC_ALL, "en_US.UTF-8"); + + std::wstring str2 = L"öäü"; + std::wregex re2; + re2.assign(L"([[:lower:]]+)"); + std::wsmatch m2; + + std::wsregex_token_iterator end {}; + std::wsregex_token_iterator p{str2.begin(), str2.end(), re2, {1}}; + + VERIFY(p == end); +} + +int +main() +{ + test01(); + return 0; +} |