mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			re PR libstdc++/54354 (TODO extended iomanip manipulators std::get_time and std::put_time (C++11, section 27.7.5))
2014-12-22 Rüdiger Sonderfeld <ruediger@c-plusplus.de> PR libstdc++/54354 * include/std/iomanip (_Get_time): New struct. (get_time): New manipulator. (operator<<): New overloaded function. * testsuite/27_io/manipulators/extended/get_time/char/1.cc: New. * testsuite/27_io/manipulators/extended/get_time/char/2.cc: New. * testsuite/27_io/manipulators/extended/get_time/wchar_t/1.cc: New. * testsuite/27_io/manipulators/extended/get_time/wchar_t/2.cc: New. From-SVN: r219013
This commit is contained in:
		
							parent
							
								
									e869c0900c
								
							
						
					
					
						commit
						0de0b10caa
					
				|  | @ -1,3 +1,14 @@ | ||||||
|  | 2014-12-22  Rüdiger Sonderfeld  <ruediger@c-plusplus.de> | ||||||
|  | 
 | ||||||
|  | 	PR libstdc++/54354 | ||||||
|  | 	* include/std/iomanip (_Get_time): New struct. | ||||||
|  | 	(get_time): New manipulator. | ||||||
|  | 	(operator<<): New overloaded function. | ||||||
|  | 	* testsuite/27_io/manipulators/extended/get_time/char/1.cc: New. | ||||||
|  | 	* testsuite/27_io/manipulators/extended/get_time/char/2.cc: New. | ||||||
|  | 	* testsuite/27_io/manipulators/extended/get_time/wchar_t/1.cc: New. | ||||||
|  | 	* testsuite/27_io/manipulators/extended/get_time/wchar_t/2.cc: New. | ||||||
|  | 
 | ||||||
| 2014-12-22  Rüdiger Sonderfeld  <ruediger@c-plusplus.de> | 2014-12-22  Rüdiger Sonderfeld  <ruediger@c-plusplus.de> | ||||||
| 	    Jonathan Wakely  <jwakely@redhat.com> | 	    Jonathan Wakely  <jwakely@redhat.com> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -392,6 +392,60 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION | ||||||
|       return __os; |       return __os; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |   template<typename _CharT> | ||||||
|  |     struct _Get_time | ||||||
|  |     { | ||||||
|  |       std::tm*	    _M_tmb; | ||||||
|  |       const _CharT* _M_fmt; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    *  @brief  Extended manipulator for extracting time. | ||||||
|  |    * | ||||||
|  |    *  This manipulator uses time_get::get to extract time. | ||||||
|  |    *  [ext.manip] | ||||||
|  |    * | ||||||
|  |    *  @param __tmb  struct to extract the time data to. | ||||||
|  |    *  @param __fmt  format string. | ||||||
|  |    */ | ||||||
|  |   template<typename _CharT> | ||||||
|  |     inline _Get_time<_CharT> | ||||||
|  |     get_time(std::tm* __tmb, const _CharT* __fmt) | ||||||
|  |     { return { __tmb, __fmt }; } | ||||||
|  | 
 | ||||||
|  |   template<typename _CharT, typename _Traits> | ||||||
|  |     basic_istream<_CharT, _Traits>& | ||||||
|  |     operator>>(basic_istream<_CharT, _Traits>& __is, _Get_time<_CharT> __f) | ||||||
|  |     { | ||||||
|  |       typename basic_istream<_CharT, _Traits>::sentry __cerb(__is, false); | ||||||
|  |       if (__cerb) | ||||||
|  |         { | ||||||
|  |           ios_base::iostate __err = ios_base::goodbit; | ||||||
|  |           __try | ||||||
|  |             { | ||||||
|  |               typedef istreambuf_iterator<_CharT, _Traits>   _Iter; | ||||||
|  |               typedef time_get<_CharT, _Iter>                _TimeGet; | ||||||
|  | 
 | ||||||
|  |               const _CharT* const __fmt_end = __f._M_fmt + | ||||||
|  |                 _Traits::length(__f._M_fmt); | ||||||
|  | 
 | ||||||
|  |               const _TimeGet& __mg = use_facet<_TimeGet>(__is.getloc()); | ||||||
|  |               __mg.get(_Iter(__is.rdbuf()), _Iter(), __is, | ||||||
|  |                        __err, __f._M_tmb, __f._M_fmt, __fmt_end); | ||||||
|  |             } | ||||||
|  |           __catch(__cxxabiv1::__forced_unwind&) | ||||||
|  |             { | ||||||
|  |               __is._M_setstate(ios_base::badbit); | ||||||
|  |               __throw_exception_again; | ||||||
|  |             } | ||||||
|  |           __catch(...) | ||||||
|  |             { __is._M_setstate(ios_base::badbit); } | ||||||
|  |           if (__err) | ||||||
|  |             __is.setstate(__err); | ||||||
|  |         } | ||||||
|  |       return __is; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| #if __cplusplus > 201103L | #if __cplusplus > 201103L | ||||||
| 
 | 
 | ||||||
| #define __cpp_lib_quoted_string_io 201304 | #define __cpp_lib_quoted_string_io 201304 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | // { dg-options " -std=gnu++11 " }
 | ||||||
|  | 
 | ||||||
|  | // 2014-04-14 Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
 | ||||||
|  | 
 | ||||||
|  | // Copyright (C) 2014 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/>.
 | ||||||
|  | 
 | ||||||
|  | // 27.7.5. (C++11) Extended manipulators [ext.manip]: put_time
 | ||||||
|  | 
 | ||||||
|  | #include <locale> | ||||||
|  | #include <sstream> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | 
 | ||||||
|  | void test01() | ||||||
|  | { | ||||||
|  |   using namespace std; | ||||||
|  |   bool test __attribute__((unused)) = true; | ||||||
|  |   locale loc_c = locale::classic(); | ||||||
|  |   istringstream iss; | ||||||
|  |   iss.imbue(loc_c); | ||||||
|  |   iss.str("12:01:30  1971"); | ||||||
|  |   tm time1; | ||||||
|  |   iss >> get_time(&time1, "%H:%M:%S %Y"); | ||||||
|  |   VERIFY( static_cast<bool>(iss) ); | ||||||
|  |   VERIFY(time1.tm_hour == 12); | ||||||
|  |   VERIFY(time1.tm_min == 1); | ||||||
|  |   VERIFY(time1.tm_sec == 30); | ||||||
|  |   VERIFY(time1.tm_year == 71); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | // { dg-require-namedlocale "de_DE.utf8" }
 | ||||||
|  | // { dg-options " -std=gnu++11 " }
 | ||||||
|  | 
 | ||||||
|  | // 2014-04-14 Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
 | ||||||
|  | 
 | ||||||
|  | // Copyright (C) 2014 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/>.
 | ||||||
|  | 
 | ||||||
|  | // 27.7.5. (C++11) Extended manipulators [ext.manip]: put_time
 | ||||||
|  | 
 | ||||||
|  | #include <locale> | ||||||
|  | #include <sstream> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | 
 | ||||||
|  | void test01() | ||||||
|  | { | ||||||
|  |   using namespace std; | ||||||
|  |   bool test __attribute__((unused)) = true; | ||||||
|  |   locale loc_c = locale::classic(); | ||||||
|  |   locale loc_de = locale("de_DE.utf8"); | ||||||
|  |   VERIFY( loc_de != loc_c ); | ||||||
|  |   istringstream iss; | ||||||
|  |   iss.imbue(loc_de); | ||||||
|  |   iss.str("Di 1971"); | ||||||
|  |   tm time1; | ||||||
|  |   iss >> get_time(&time1, "%a %Y"); | ||||||
|  |   VERIFY(time1.tm_wday == 2); | ||||||
|  |   VERIFY(time1.tm_year == 71); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | // { dg-options " -std=gnu++11 " }
 | ||||||
|  | 
 | ||||||
|  | // 2014-04-14 Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
 | ||||||
|  | 
 | ||||||
|  | // Copyright (C) 2014 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/>.
 | ||||||
|  | 
 | ||||||
|  | // 27.7.5. (C++11) Extended manipulators [ext.manip]: put_time
 | ||||||
|  | 
 | ||||||
|  | #include <locale> | ||||||
|  | #include <sstream> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | 
 | ||||||
|  | void test01() | ||||||
|  | { | ||||||
|  |   using namespace std; | ||||||
|  |   bool test __attribute__((unused)) = true; | ||||||
|  |   locale loc_c = locale::classic(); | ||||||
|  |   wistringstream iss; | ||||||
|  |   iss.imbue(loc_c); | ||||||
|  |   iss.str(L"12:01:30  1971"); | ||||||
|  |   tm time1; | ||||||
|  |   iss >> get_time(&time1, L"%H:%M:%S %Y"); | ||||||
|  |   VERIFY( static_cast<bool>(iss) ); | ||||||
|  |   VERIFY(time1.tm_hour = 12); | ||||||
|  |   VERIFY(time1.tm_min = 1); | ||||||
|  |   VERIFY(time1.tm_sec == 30); | ||||||
|  |   VERIFY(time1.tm_year == 71); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,50 @@ | ||||||
|  | // { dg-require-namedlocale "de_DE.utf8" }
 | ||||||
|  | // { dg-options " -std=gnu++11 " }
 | ||||||
|  | 
 | ||||||
|  | // 2014-04-14 Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
 | ||||||
|  | 
 | ||||||
|  | // Copyright (C) 2014 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/>.
 | ||||||
|  | 
 | ||||||
|  | // 27.7.5. (C++11) Extended manipulators [ext.manip]: put_time
 | ||||||
|  | 
 | ||||||
|  | #include <locale> | ||||||
|  | #include <sstream> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <iostream> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | 
 | ||||||
|  | void test01() | ||||||
|  | { | ||||||
|  |   using namespace std; | ||||||
|  |   bool test __attribute__((unused)) = true; | ||||||
|  |   locale loc_c = locale::classic(); | ||||||
|  |   locale loc_de = locale("de_DE.utf8"); | ||||||
|  |   VERIFY( loc_de != loc_c ); | ||||||
|  |   wistringstream iss; | ||||||
|  |   iss.imbue(loc_de); | ||||||
|  |   iss.str(L"Montag 1971"); | ||||||
|  |   tm time1; | ||||||
|  |   iss >> get_time(&time1, L"%A %Y"); | ||||||
|  |   VERIFY(time1.tm_wday == 1); | ||||||
|  |   VERIFY(time1.tm_year == 71); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	 Rüdiger Sonderfeld
						Rüdiger Sonderfeld