]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - libstdc++-v3/testsuite/22_locale/time_put/put/char/9780-1.cc
Imported gcc-4.4.3
[msp430-gcc.git] / libstdc++-v3 / testsuite / 22_locale / time_put / put / char / 9780-1.cc
diff --git a/libstdc++-v3/testsuite/22_locale/time_put/put/char/9780-1.cc b/libstdc++-v3/testsuite/22_locale/time_put/put/char/9780-1.cc
new file mode 100644 (file)
index 0000000..ea40ae9
--- /dev/null
@@ -0,0 +1,132 @@
+// { dg-require-namedlocale "" }
+
+// Copyright (C) 2004, 2005, 2009 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/>.
+
+#include <sstream>
+#include <locale>
+#include <testsuite_hooks.h>
+
+int main()
+{
+  using namespace std;
+
+  bool test __attribute__((unused)) = true;
+  locale l1 = locale("de_DE");
+  locale l2 = locale("es_ES");
+  
+  const time_put<char> &tp = use_facet<time_put<char> >(l1);  
+  ostringstream oss;
+  oss.imbue(l2);
+  
+  tm t = tm();  
+  tp.put(oss.rdbuf(), oss, ' ', &t, 'A');
+  string res = oss.str();
+  
+  VERIFY( res == "domingo" );
+
+  return 0;
+}
+
+// Two interpretations of the standard.
+
+// 1 : time_get, time_put each have their own data internally
+//   use internal data for time and date specifics
+//   use getloc for ctype info
+
+// 2 : time_get, time_put use the ios_base& argument and getloc to
+// retrieve the necessary data.
+//   use getloc for ctype, time and date specifics
+
+// It is my opinion that the language in the standard is sufficiently
+// vague to permit both interpretations. In particular, the interface
+// for time_get and time_put is based on strftime, which as
+// POSIX notes is dependent on LC_TIME. The C++ standard, however,
+// does not specify the equivalent mappings of LC_TIME to time_get and
+// time_put.
+
+/*
+The problems with the first approach, as above, are numerous.
+
+1) The locale usage and design for formatters and parsers becomes
+   fragmented. On one side, num_put and money_put, and on the other,
+   time_put. This inconsistency is not useful.
+
+2) The data structures for time and date formatting are the largest in
+   the locale library. Making time_put and time_get keep separate
+   copies is inefficient. (Note that time_put and time_get are in the
+   same locale::category).
+*/
+
+
+/*
+22.2.5 - The time category [lib.category.time]
+
+-1- Templates time_get<charT,InputIterator> and
+ time_put<charT,OutputIterator> provide date and time formatting and
+ parsing. All specifications of member functions for time_put and
+ time_get in the subclauses of lib.category.time only apply to the
+ instantiations required in Tables 51 and 52
+ (lib.locale.category). Their members use their ios_base&,
+ ios_base::iostate&, and fill arguments as described in
+ (lib.locale.categories), and the ctype<> facet, to determine
+ formatting details.
+*/
+
+/*
+22.2 - Standard locale categories [lib.locale.categories]
+
+-1- Each of the standard categories includes a family of facets. Some
+ of these implement formatting or parsing of a datum, for use by
+ standard or users' iostream operators << and >>, as members put() and
+ get(), respectively. Each such member function takes an ios_base&
+ argument whose members flags(), precision(), and width(), specify the
+ format of the corresponding datum. (lib.ios.base). Those functions
+ which need to use other facets call its member getloc() to retrieve
+ the locale imbued there. Formatting facets use the character argument
+ fill to fill out the specified width where necessary.
+*/
+
+/*
+With GCC/libstdc++, the output of the program with the arguments
+of de_DE es_ES is:
+     domingo
+     lunes
+     martes
+     miércoles
+     jueves
+     viernes
+     sábado
+
+With Intel C++, it is: (this is clearly wrong)
+     Sunday
+     Monday
+     Tuesday
+     Wednesday
+     Thursday
+     Friday
+     Saturday
+
+And with RogueWave C++
+     Sonntag
+     Montag
+     Dienstag
+     Mittwoch
+     Donnerstag
+     Freitag
+     Samstag
+*/