X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Ftestsuite%2F22_locale%2Ftime_put%2Fput%2Fchar%2F9780-1.cc;fp=libstdc%2B%2B-v3%2Ftestsuite%2F22_locale%2Ftime_put%2Fput%2Fchar%2F9780-1.cc;h=ea40ae998e9b78aec75569555fcff1157f6869fe;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=0000000000000000000000000000000000000000;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git 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 index 00000000..ea40ae99 --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/time_put/put/char/9780-1.cc @@ -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 +// . + +#include +#include +#include + +int main() +{ + using namespace std; + + bool test __attribute__((unused)) = true; + locale l1 = locale("de_DE"); + locale l2 = locale("es_ES"); + + const time_put &tp = use_facet >(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 and + time_put 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 +*/