diff options
author | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2001-11-28 06:29:55 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2001-11-28 06:29:55 +0000 |
commit | ec9d6e9f45ea25fd6c5aea6ebb67a51eda432745 (patch) | |
tree | 9a4526a3b94f602e078a1cb0a0ee3d91d20d6e64 | |
parent | 2883d58bf5caa2a6d05f16248bb8607655c3e128 (diff) | |
download | gcc-ec9d6e9f45ea25fd6c5aea6ebb67a51eda432745.zip gcc-ec9d6e9f45ea25fd6c5aea6ebb67a51eda432745.tar.gz gcc-ec9d6e9f45ea25fd6c5aea6ebb67a51eda432745.tar.bz2 |
Numeric facets cleanup.
2001-11-27 Benjamin Kosnik <bkoz@redhat.com>
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
-rw-r--r-- | libstdc++-v3/testsuite/22_locale/num_get_members_wchar_t.cc | 250 |
1 files changed, 250 insertions, 0 deletions
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 0000000..e8d2353 --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/num_get_members_wchar_t.cc @@ -0,0 +1,250 @@ +// 2001-11-26 Benjamin Kosnik <bkoz@redhat.com> + +// 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 <locale> +#include <sstream> +#include <testsuite_hooks.h> + +// 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<wchar_t> 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<wchar_t>& numpunct_c = use_facet<numpunct<wchar_t> >(loc_c); + const numpunct<wchar_t>& numpunct_de = use_facet<numpunct<wchar_t> >(loc_de); + const numpunct<wchar_t>& numpunct_hk = use_facet<numpunct<wchar_t> >(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<wchar_t>& ng = use_facet<num_get<wchar_t> >(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 + |