From ec9d6e9f45ea25fd6c5aea6ebb67a51eda432745 Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Wed, 28 Nov 2001 06:29:55 +0000 Subject: [PATCH] Numeric facets cleanup. 2001-11-27 Benjamin Kosnik Numeric facets cleanup. * include/bits/locale_facets.h (__num_base::_S_atoms): Add, remove + and - signs. (__num_base::_M_zero): Add (__num_base::_M_e): Add. (__num_base::_M_E): Add. * include/bits/locale_facets.tcc (num_get::_M_extract): Remove. (num_get::_M_extract_float): New. (num_get::_M_extract_int): New. * src/locale.cc (num_get::_M_extract): Remove. * include/bits/locale_facets.tcc (num_put::_M_insert_float): Simplify, use _M_insert. (num_put::do_put(bool)): Simplify, remove __pad. (__pad): Remove. (__pad_output): Change to __pad. * include/bits/ostream.tcc: And here. * src/locale-inst: Remove instantiations. * include/bits/locale_facets.h: Move helper functions in to class num_put. (num_put::_M_insert_float): Same, for __output_integer. (num_put::_M_insert_int): Same, for __output_float. (num_put::_M_insert): New. (__num_base): Add. (__num_base::_S_format_float): Move __build_float_format into class __num_base. (__num_base::_S_format_int): Move __build_int_format into class __num_base. * include/bits/locale_facets.tcc (__group_digits): Change to (__add_grouping): This. * src/locale-inst.cc: And here. Tweak instantiations. * src/misc-inst.cc: Remove instantiations. * include/bits/ostream.tcc (__pad_char): Rename, adjust inserters for new calling conventions, move to... * include/bits/locale_facets.tcc (__pad_output): Here. Adjust signature to make it useful for both ostream and num_put. (__pad_numeric): Remove. * src/misc-inst.cc: Remove instantiations. * src/locale-inst.cc: Same. * include/bits/locale_facets.h (_Numeric_get): Remove. (_Numeric_put): Remove. (num_get::get(short)): Remove. (num_get::get(int)): Remove. (num_get::do_get(short)): Remove. (num_get::do_get(int)): Remove. * include/bits/istream.tcc (istream::operator>>(short)): Fix as per DR 118. (istream::operator>>(int)): Same. * include/bits/locale_facets.h (_Format_cache): Remove. * include/bits/locale_facets.tcc: Same. * src/locale.cc: Same. * src/locale-inst.cc: Same. * include/bits/ostream.tcc: Same. * src/ios.cc (ios_base::imbue): Remove here as well. * testsuite/22_locale/num_get.cc: New file. * testsuite/22_locale/num_get_members_char.cc: New file. * testsuite/22_locale/num_get_members_wchar_t.cc: New. * testsuite/22_locale/numpunct_members_wchar_t.cc: New file. * testsuite/22_locale/num_put.cc: New file. * testsuite/22_locale/num_put_members_char.cc: New file. * testsuite/22_locale/num_put_members_wchar_t.cc: New file. * testsuite/27_io/ostream_inserter_arith.cc: Fix. * testsuite/27_io/istream_extractor_arith.cc: Fix. From-SVN: r47399 --- .../22_locale/num_get_members_wchar_t.cc | 250 ++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 libstdc++-v3/testsuite/22_locale/num_get_members_wchar_t.cc diff --git a/libstdc++-v3/testsuite/22_locale/num_get_members_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/num_get_members_wchar_t.cc new file mode 100644 index 00000000000..e8d2353d32a --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/num_get_members_wchar_t.cc @@ -0,0 +1,250 @@ +// 2001-11-26 Benjamin Kosnik + +// Copyright (C) 2001 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// 22.2.2.1.1 num_get members + +#include +#include +#include + +// XXX This test is not working for non-glibc locale models. +// { dg-do run { xfail *-*-* } } + +#ifdef _GLIBCPP_USE_WCHAR_T +void test01() +{ + using namespace std; + typedef istreambuf_iterator iterator_type; + + bool test = true; + + // basic construction + locale loc_c = locale::classic(); + locale loc_hk("en_HK"); + locale loc_fr("fr_FR@euro"); + locale loc_de("de_DE"); + VERIFY( loc_c != loc_de ); + VERIFY( loc_hk != loc_fr ); + VERIFY( loc_hk != loc_de ); + VERIFY( loc_de != loc_fr ); + + // cache the numpunct facets + const numpunct& numpunct_c = use_facet >(loc_c); + const numpunct& numpunct_de = use_facet >(loc_de); + const numpunct& numpunct_hk = use_facet >(loc_hk); + + // sanity check the data is correct. + const string empty; + char c; + + bool b1 = true; + bool b0 = false; + long l1 = 2147483647; + long l2 = -2147483647; + long l; + unsigned long ul1 = 1294967294; + unsigned long ul2 = 0; + unsigned long ul; + double d1 = 1.02345e+308; + double d2 = 3.15e-308; + double d; + long double ld1 = 6.630025e+4; + long double ld2 = 0.0; + long double ld; + void* v; + const void* cv = &ul2; + + // cache the num_get facet + wistringstream iss; + iss.imbue(loc_de); + const num_get& ng = use_facet >(iss.getloc()); + const ios_base::iostate goodbit = ios_base::goodbit; + const ios_base::iostate eofbit = ios_base::eofbit; + ios_base::iostate err = ios_base::goodbit; + + // bool, simple + iss.str(L"1"); + iterator_type os_it00 = iss.rdbuf(); + iterator_type os_it01 = ng.get(os_it00, 0, iss, err, b1); + VERIFY( b1 == true ); + VERIFY( err & ios_base::eofbit ); + + iss.str(L"0"); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, b0); + VERIFY( b0 == false ); + VERIFY( err & eofbit ); + + // bool, more twisted examples + iss.imbue(loc_c); + iss.str(L"true "); + iss.clear(); + iss.setf(ios_base::boolalpha); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, b0); + VERIFY( b0 == true ); + VERIFY( err == goodbit ); + + iss.str(L"false "); + iss.clear(); + iss.setf(ios_base::boolalpha); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, b1); + VERIFY( b1 == false ); + VERIFY( err == goodbit ); + + // long, in a locale that expects grouping + iss.imbue(loc_hk); + iss.str(L"2,147,483,647 "); + iss.clear(); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, l); + VERIFY( l == l1 ); + VERIFY( err == goodbit ); + + iss.str(L"-2,147,483,647++++++"); + iss.clear(); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, l); + VERIFY( l == l2 ); + VERIFY( err == goodbit ); + + // unsigned long, in a locale that does not group + iss.imbue(loc_c); + iss.str(L"1294967294"); + iss.clear(); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, ul); + VERIFY( ul == ul1); + VERIFY( err == eofbit ); + + iss.str(L"0+++++++++++++++++++"); + iss.clear(); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, ul); + VERIFY( ul == ul2); + VERIFY( err == goodbit ); + + // ... and one that does + iss.imbue(loc_de); + iss.str(L"1.294.967.294+++++++"); + iss.clear(); + iss.width(20); + iss.setf(ios_base::left, ios_base::adjustfield); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, ul); + VERIFY( ul == ul1 ); + VERIFY( err == goodbit ); + + // double + iss.imbue(loc_c); + iss.str(L"1.02345e+308++++++++"); + iss.clear(); + iss.width(20); + iss.setf(ios_base::left, ios_base::adjustfield); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, d); + VERIFY( d == d1 ); + VERIFY( err == goodbit ); + + iss.str(L"+3.15e-308"); + iss.clear(); + iss.width(20); + iss.setf(ios_base::right, ios_base::adjustfield); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, d); + VERIFY( d == d2 ); + VERIFY( err == eofbit ); + + iss.imbue(loc_de); + iss.str(L"+1,02345e+308"); + iss.clear(); + iss.width(20); + iss.setf(ios_base::right, ios_base::adjustfield); + iss.setf(ios_base::scientific, ios_base::floatfield); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, d); + VERIFY( d == d1 ); + VERIFY( err == eofbit ); + + iss.str(L"3,15E-308 "); + iss.clear(); + iss.width(20); + iss.precision(10); + iss.setf(ios_base::right, ios_base::adjustfield); + iss.setf(ios_base::scientific, ios_base::floatfield); + iss.setf(ios_base::uppercase); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, d); + VERIFY( d == d2 ); + VERIFY( err == goodbit ); + + // long double + iss.str(L"6,630025e+4"); + iss.clear(); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, ld); + VERIFY( ld == ld1 ); + VERIFY( err == eofbit ); + + iss.str(L"0 "); + iss.clear(); + iss.precision(0); + iss.setf(ios_base::fixed, ios_base::floatfield); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, ld); + VERIFY( ld == 0 ); + VERIFY( err == goodbit ); + + // const void + iss.str(L"0xbffff74c."); + iss.clear(); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, v); + VERIFY( &v != &cv ); + VERIFY( err == goodbit ); + + +#ifdef _GLIBCPP_USE_LONG_LONG + long long ll1 = 9223372036854775807; + long long ll2 = -9223372036854775807; + long long ll; + + iss.str(L"9.223.372.036.854.775.807"); + iss.clear(); + err = goodbit; + ng.get(iss.rdbuf(), 0, iss, err, ll); + VERIFY( ll == ll1 ); + VERIFY( err == eofbit ); +#endif +} +#endif + +int main() +{ +#ifdef _GLIBCPP_USE_WCHAR_T + test01(); +#endif + return 0; +} + + +// Kathleen Hannah, humanitarian, woman, art-thief + -- 2.30.2